Problem with values of an ArrayList passed by Intent

0

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();

            }
        });


    }

}
    
asked by anonymous 23.02.2015 / 20:30

1 answer

0

I managed to do it in a way but I do not know if it is considered a "gambiarra".

What I did was instead of going through the whole list, I searched for index, but this is bad because if I have 50 items, I'll have to put those 50 positions.

I'm looking for the items as follows:

 "<br />" + "Lista de itens solicitados:" +
                        "<br />" +
                        "<br />" + "Produto: " + listaDeItensDaCompra.get(0).getProduto().getNome() +
                        "<br />" + "Descrição: " + listaDeItensDaCompra.get(0).getProduto().getUnidadeDeMedida() +
                        "<br />" + "Preço unitário: " + CurrencyUtils.format(BigDecimal.valueOf(Double.parseDouble(String.valueOf(listaDeItensDaCompra.get(0).getProduto().getValor())))) +
                        "<br />" + "Quantidade :" + listaDeItensDaCompra.get(0).getQuantidade() +

                        "<br />" + "---------------------------------------------------" +
                        "<br />" + "Produto: " + listaDeItensDaCompra.get(1).getProduto().getNome() +
                        "<br />" + "Descrição: " + listaDeItensDaCompra.get(1).getProduto().getUnidadeDeMedida() +
                        "<br />" + "Preço unitário: " + CurrencyUtils.format(BigDecimal.valueOf(Double.parseDouble(String.valueOf(listaDeItensDaCompra.get(1).getProduto().getValor())))) +
                        "<br />" + "Quantidade :" + listaDeItensDaCompra.get(1).getQuantidade();

If anyone knows how to do this better, I'll be very grateful!

    
24.02.2015 / 15:40