Why does the count continue from the previous item and not from 0?

2

I have a problem.

I made a method that calculates the count from clicks on the screen and throws that count into a EditText , but the problem is that the count continues from the previous item, 0 on the next line.

Example:

If the item in ListView is in the number 5 , if I click on the other line, the number will be 6 .

I do not know if it has to do with the "end" that I put in the finalHolder attribute before the setOnClickListener method.

Follow the code:

public class AdapterProduto extends BaseAdapter {

    private Context ctx;
    private List<Produto> listaProdutos;
    private int count;
    private int newCount;


    public AdapterProduto(Context ctx, List<Produto> listaProdutos) {
        this.ctx = ctx;
        this.listaProdutos = listaProdutos;
    }

    @Override
    public int getCount() {

        return listaProdutos.size();
    }

    @Override
    public Object getItem(int posicao) {

        return listaProdutos.get(posicao);
    }

    @Override
    public long getItemId(int posicao) {

        return listaProdutos.get(posicao).getId();
    }

    class MyViewHolder {
        TextView texto;
        ImageView soma;
        ImageView sub;
        ImageView excluir;
        EditText contagem;

        MyViewHolder(View v) {
            texto = (TextView) v.findViewById(R.id.textViewLista);
            soma = (ImageView) v.findViewById(R.id.ImagemAddProduto);
            sub = (ImageView) v.findViewById(R.id.ImagemSubProduto);
            excluir = (ImageView) v.findViewById(R.id.ImagemExcluir);
            contagem = (EditText) v.findViewById(R.id.contagemDePodutosDaLista);
        }
    }

    @Override
    public View getView(int posicao, View convertView, ViewGroup parent) {

        View row = convertView;

        MyViewHolder holder = null;

        if (row == null) {

            LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.layout_lista, parent, false);

            holder = new MyViewHolder(row);
            row.setTag(holder);
            Log.i("Testando Holder", "Criando um novo row");
        } else {
            holder = (MyViewHolder) row.getTag();
            Log.i("Testando Holder", "Repassando");
        }
        Produto produto = listaProdutos.get(posicao);
        holder.texto.setText(produto.getConteudo());
        holder.soma.setImageResource(R.drawable.ic_add);
        holder.sub.setImageResource(R.drawable.ic_delete);
        holder.excluir.setImageResource(R.drawable.ic_trash);
        holder.contagem.setId(R.id.contagemDePodutosDaLista);

        final MyViewHolder finalHolder = holder;
        holder.soma.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (v.getId() == finalHolder.soma.getId()){
                Log.i("Adapter", "Dentro do metodo de fazer a contagem");
                Integer.parseInt(finalHolder.contagem.getText().toString());
                count = count + 1;
                finalHolder.contagem.setText(String.valueOf(count));
                Log.i("Adapter", "Contagem efetuada");
            }
                else
                {

                    Integer.parseInt(finalHolder.contagem.getText().toString());
                    newCount = newCount + 1;
                    finalHolder.contagem.setText(String.valueOf(newCount));

                }
            }
        });

        return row;
    }

}
    
asked by anonymous 29.01.2015 / 20:30

1 answer

1

First, your code needs to follow a pattern in the nomenclature you use, if it is not difficult to do an analysis. ex.: soma , contagem , etc ... The most interesting would be, like the books I read about android is doing the following way. ivSoma , etContagem , etc ... So we can understand that ivSoma is ImageView , so it makes it much easier to maintain, since declarations are usually made at the beginning of the class or method, just the way you do give scroll several times to make identification.

Answering the question

if (v.getId() == finalHolder.soma.getId()){
   Log.i("Adapter", "Dentro do metodo de fazer a contagem");
   //repare que nenhuma variável está recebendo o valor na linha de baixo.
   Integer.parseInt(finalHolder.contagem.getText().toString());
   //contador count deve ser uma variável local/temporária, 
   //vc declarou ela como global da classe. 
   count = count + 1;
   finalHolder.contagem.setText(String.valueOf(count));
   Log.i("Adapter", "Contagem efetuada");
}

The right thing would be

if (v.getId() == finalHolder.soma.getId()){
   Log.i("Adapter", "Dentro do metodo de fazer a contagem");
   int cont = Integer.parseInt(finalHolder.contagem.getText().toString());
   count++;
   finalHolder.contagem.setText(String.valueOf(count));
   Log.i("Adapter", "Contagem efetuada");
}

The same thing goes for the code inside else . One other thing, you declared contagem as a EditText , or you hope no one enters with a string or you disable entry. As it is only for show it would be interesting to declare as TextView .

    
29.01.2015 / 21:35