Problem with Arraylist values passed by Intent

Asked

Viewed 215 times

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

            }
        });


    }

}

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 entire list, I searched by index, but that’s bad because if I have 50 items, I have to put those 50 positions.

I am searching 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 in a better way, I’d be very grateful!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.