I'm having trouble retrieving all values of selected items from a list that are passed by Intent, because the result shows the last product in the list.
I've tried everything, but I do not understand why this is occurring.
I made minor changes to the code, so I went through the list before sending the email.
The method that sends the list is within the setEvents () of the ProductActivity Activity.
I retrieve the list in the onActivityResult () method of the ServiceElementActivityActivity and finally use it in the event ui.btnErrorError () within setEvents () of the same Activity.
The problem is that when I scroll through this list, it saves the last item found, but if I put the whole list without going, I can get the reference of all the selected items.
Follow the code below and thank you in advance.
ServiceEmailActivity Activity:
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();
}
}
});
}
}
ProductActivity Activity:
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();
}
});
}
}