0
I am having trouble recovering all values of selected items from a list that are passed by Intent, as the result shows the last product from the list.
I’ve tried everything, but I don’t understand why this is happening.
I made small changes to the code, so I went through the list before sending the email.
The method that sends the list is within the Activity Produtoactivity setEvents().
I retrieve the list in the onActivityResult() method of Activity Servicodeemailactivity and finally use in the event ui.btnEnviarPedidoParaEmail() within setEvents() of the same Activity.
The problem is that when I go through this list, it stores the last found item, but if I put the entire list without going through, I can get the reference of all the selected items.
Follow the code below and thank you in advance.
Activity Servicodeemailactivity:
public class ServicoDeEmailActivity extends ActionBarActivity implements Serializable {
Session session = null;
ProgressDialog pdialog = null;
Context context = null;
String rec;
String subject;
String textMessage;
private UIHelper ui;
double valorDoPedido;
App applic;
ArrayList<ItemCompra> listaDeItensDaCompra;
List<ItemCompra> listaTeste;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_servico_de_email);
this.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
init();
context = this;
setEvents();
}
/*
O método onActivityResult é casado com o método startActivityForResult, pois
ele é responsével por obter os valores capturados pelo método startActivityForResult.
*/
public void onActivityResult(int codigo, int resultado, Intent intent) {
if (resultado == RESULT_OK) {
this.valorDoPedido = intent.getDoubleExtra("ValorDoProduto", valorDoPedido);
listaDeItensDaCompra = (ArrayList<ItemCompra>) intent.getSerializableExtra("lista");
ui.txtValorTotalDoPedido.setText(CurrencyUtils.format(BigDecimal.valueOf(valorDoPedido)));
}
}
public void init() {
ui = new UIHelper();
App app = (App) getApplicationContext();
}
class UIHelper {
TextView txtValorTotalDoPedido;
EditText nome;
EditText rua;
EditText numero;
EditText complemento;
EditText bairro;
EditText telefone1;
EditText telefone2;
EditText cep;
Button botao;
Button btnEnviarPedidoParaEmail;
public UIHelper() {
txtValorTotalDoPedido = (TextView) findViewById(R.id.txt_valor_total);
nome = (EditText) findViewById(R.id.nome);
rua = (EditText) findViewById(R.id.rua);
numero = (EditText) findViewById(R.id.numero);
complemento = (EditText) findViewById(R.id.complemento);
bairro = (EditText) findViewById(R.id.bairro);
telefone1 = (EditText) findViewById(R.id.telefone1);
telefone2 = (EditText) findViewById(R.id.telefone2);
cep = (EditText) findViewById(R.id.cep);
botao = (Button) findViewById(R.id.botaoIrParaProdutos);
btnEnviarPedidoParaEmail = (Button) findViewById(R.id.botaoEnviaPedido);
}
}
public void setEvents() {
/*
Utilizando a Máscara para transformar os campos telefone1, telefone2 e cep.
*/
ui.telefone1.addTextChangedListener(Mask
.insert("(##)####-####", ui.telefone1));
ui.telefone2.addTextChangedListener(Mask
.insert("(##)####-####", ui.telefone2));
ui.cep.addTextChangedListener(Mask.insert("#####-###", ui.cep));
/*
Este botão chama a activity ProdutoActivity, assim trazendo as informações
da lista de produtos com o método startActivity.
Não posso usar "startActivity" se eu tenho algo a "trazer" de outra activity.
Por isso é utilizado "startActivityForResult"
*/
ui.botao.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent irParaListaDeProdutos = new Intent();
irParaListaDeProdutos.setClass(ServicoDeEmailActivity.this,
ProdutoActivity.class);
int codigoDoRetornoDasInformacoesDoProdutoActivity = 0;
startActivityForResult(irParaListaDeProdutos, codigoDoRetornoDasInformacoesDoProdutoActivity);
}
});
/*
Este botão faz a comunicação da aplicação, assim enviando um email ao valor
colocado na variável "rec".
A variável "subject" é o "Assunto" do email e a variável "textMessage" é o corpo do email.
*/
ui.btnEnviarPedidoParaEmail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String nomeDoProduto;
String descricaoDoProduto;
int quantidadeDoProduto;
double precoUnitarioDoProduto;
for (ItemCompra listaDeItens : listaDeItensDaCompra) {
nomeDoProduto = listaDeItens.getProduto().getNome();
descricaoDoProduto = listaDeItens.getProduto().getUnidadeDeMedida();
precoUnitarioDoProduto = Double.parseDouble(String.valueOf(listaDeItens.getProduto().getValor()));
quantidadeDoProduto = listaDeItens.getQuantidade();
rec = "";
subject = "Pedido Solicitado";
textMessage = "Nome: " + ui.nome.getText() +
"<br />" + "Rua: " + ui.rua.getText() +
"<br />" + "Número: " + ui.numero.getText() +
"<br />" + "Complemento: " + ui.complemento.getText() +
"<br />" + "Bairro: " + ui.bairro.getText() +
"<br />" + "CEP: " + ui.cep.getText() +
"<br />" + "Telefone: " + ui.telefone1.getText() +
"<br />" + "Celular: " + ui.telefone2.getText() +
"<br />" + "Valor total do Pedido: " + CurrencyUtils.format(BigDecimal.valueOf(valorDoPedido)) +
"<br />" + "---------------------------------------------------" +
"<br />" + "Lista de itens solicitados:" +
"<br />" + "Produto: " + nomeDoProduto +
"<br />" + "Descrição: " + descricaoDoProduto +
"<br />" + "Preço unitário: " + CurrencyUtils.format(BigDecimal.valueOf(precoUnitarioDoProduto)) +
"<br />" + "Quantidade :" + quantidadeDoProduto;
}
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
/*
Nessa parte do código é necessario ter uma conta do gmail para poder utilizar as configurações
e portas do gmail.
*/
session = Session.getDefaultInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("", "");
}
});
pdialog = ProgressDialog.show(context, "", "Enviando o pedido para o email...", true);
RetreiveFeedTask task = new RetreiveFeedTask();
task.execute();
}
class RetreiveFeedTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(""));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(rec));
message.setSubject(subject);
message.setContent(textMessage, "text/html; charset=utf-8");
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String result) {
pdialog.dismiss();
Toast.makeText(getApplicationContext(), "Pedido enviado com sucesso!", Toast.LENGTH_SHORT).show();
}
}
});
}
}
Activity Produtoactivity:
public class ProdutoActivity extends Activity implements Serializable {
private UIHelper ui;
private App app;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.produtos);
init();
setEvents();
}
private void init() {
ui = new UIHelper();
app = (App) getApplication();
CallBackItemClick on = event();
ui.listView.setAdapter(new AdapterProdutoArrayAdapter(this, R.layout.layout_lista, ItemCompra.getFakeList(), on));
updateTotalValue();
}
private CallBackItemClick event() {
return new CallBackItemClick() {
@Override
public void updateValue() {
updateTotalValue();
}
};
}
public void updateTotalValue() {
ui.txtTotal.setText(CurrencyUtils.format(app.compra.getValorTotalDaCompra()));
}
class UIHelper {
TextView txtTotal;
ListView listView;
Button finalizaPedido;
public UIHelper() {
txtTotal = (TextView) findViewById(R.id.txt_total);
listView = (ListView) findViewById(R.id.listViewProduto);
finalizaPedido = (Button) findViewById(R.id.btn_finalizar_pedido);
}
}
public void setEvents() {
ui.finalizaPedido.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
double valorTotal;
Bundle parametro;
Intent intent;
ArrayList<ItemCompra> listaDeProdutosNoCarrinho;
valorTotal = Double.parseDouble(String.valueOf(app.compra.getValorTotalDaCompra()));
parametro = new Bundle();
listaDeProdutosNoCarrinho = (ArrayList<ItemCompra>) app.compra.getItensCompra();
parametro.putDouble("ValorDoProduto", valorTotal);
parametro.putSerializable("lista", listaDeProdutosNoCarrinho);
intent = new Intent(ProdutoActivity.this, ServicoDeEmailActivity.class);
intent.putExtras(parametro);
setResult(RESULT_OK, intent);
finish();
}
});
}
}