2

I have a viewholder in my Android app and I tried to set an incremented value on a textfield. I tried it like following,

Activity

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        holder = new Holder();
        LayoutInflater inflater = (LayoutInflater) this.context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.menu_list_item, null);

        holder.textViewItemName = (TextView) convertView.findViewById(R.id.textViewItemName);
        holder.textViewPrice = (TextView) convertView.findViewById(R.id.textViewPrice);
        holder.imageView = (ImageView) convertView.findViewById(R.id.imageViewItem);
        holder.buttonPlus = (ButtonRectangle) convertView.findViewById(R.id.buttonPlus);
        holder.cartQtyTextView = (TextView) convertView.findViewById(R.id.textViewCartQty);
        holder.buttonMinus = (ButtonRectangle) convertView.findViewById(R.id.buttonMinus);
        convertView.setTag(holder);
    } else {
        holder = (Holder) convertView.getTag();
    }
    final MenuItem listItem = objects.get(position);
    holder.textViewItemName.setText(listItem.getItemName());
    holder.textViewPrice.setText("$ ".concat(String.valueOf(listItem.getItemPrice())));

    // Check & Set
    if (holder.buttonPlus != null) {
        holder.buttonPlus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (holder.cartQtyTextView != null) {
                    if (holder.inc >= 0) {
                        holder.cartQtyTextView.setText(String.valueOf(holder.inc++));
                    }
                }
            }
        });
    }
    holder.buttonPlus.setBackgroundColor(Color.WHITE);
    holder.buttonPlus.setTextColor(Color.parseColor("#333333"));

    // Check & Set
    if (holder.buttonMinus != null) {
        holder.buttonMinus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (holder.inc >= 0) {
                    holder.cartQtyTextView.setText(String.valueOf(holder.inc--));
                }
            }
        });
    }
    holder.buttonMinus.setBackgroundColor(Color.WHITE);
    holder.buttonMinus.setTextColor(Color.parseColor("#333333"));

    return convertView;

}

Holder

class Holder {
    ButtonRectangle buttonPlus;
    ButtonRectangle buttonMinus;
    TextView cartQtyTextView;
    TextView textViewItemName;
    TextView textViewPrice;
    ImageView imageView;
    int inc;
}

But this is incrementing randomly. How may I fix this?

codebot
  • 2,540
  • 3
  • 38
  • 89

3 Answers3

3
 > But this is incrementing randomly

that is because the viewholder may belong to different order-lines.

Example

  • in the beginning viewholder#1 belongs to orderline #1 with inc=2
  • if you scroll down the listbox orderline #1 becomes invisible and orderline #27 becomes visible. .
  • now orderline #27 is reusing viewholder#1 and with inc=2

how to fix this:

you need an objectmodell that store the data inc, articleid, quantity, unitprice, articlename, ......

 final OrderItem orderItem = (OrderItem) objects.get(position);
 ...
 orderItem.inc++;

See also https://stackoverflow.com/search?q=listview+random

Community
  • 1
  • 1
k3b
  • 14,517
  • 7
  • 53
  • 85
1

When you click button it gets the TextView corresponding to that position..

  1. At OnClick button, get TextView of position you Clicked..

  2. getText() of that TextView, implement condition to increase/decrease your inc then setText() to that TextView

I would also suggest to take a local variable inside your Adapter class instead of Holder class as it would be easy to manipulate its value..

Iamat8
  • 3,888
  • 9
  • 25
  • 35
0

You also need to set a tag for the Button, if you want to manipulate the holder item.

   if (convertView == null) {
        ...
        holder.buttonPlus = (ButtonRectangle) convertView.findViewById(R.id.buttonPlus);
        holder.buttonPlus.setTag(holder);
        holder.buttonPlus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Holder current= (Holder) v.getTag();
                current.inc=current.inc+1;
                notifyDataSetChanged();
            }
        });
        convertView.setTag(holder);
    } else {
        holder = (Holder) convertView.getTag();
    }
makata
  • 2,188
  • 2
  • 28
  • 23