如何在 android 中增加视图持有者变量的值?

How to increment a value on view holder variables in android?

我的 Android 应用程序中有一个 viewholder,我试图在文本字段上设置递增值。我试过如下,

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;

}

持有人

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

但这是随机递增的。我该如何解决这个问题?

 > But this is incrementing randomly

那是因为viewholder可能属于不同的订单行。

示例

  • 一开始 viewholder#1 属于 orderline #1 with inc=2
  • 如果向下滚动列表框,订单行 #1 将变为不可见,而订单行 #27 将变为可见。 .
  • 现在 orderline #27 正在重用 viewholder#1 并且 inc=2

如何解决这个问题:

您需要一个对象模型来存储数据 inc、articleid、quantity、unitprice、articlename、......

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

另见 https://whosebug.com/search?q=listview+random

当您单击按钮时,它会获得对应于该位置的 TextView..

  1. OnClick 按钮处,获取您单击的位置的 TextView..

  2. getText() of that TextView, 执行条件 increase/decrease 你的 inc 然后 setText() TextView

我还建议在 Adapter class 中取一个局部变量而不是 Holder class 因为它很容易操纵它的值..

如果你想操作 holder 项目,你还需要为 Button 设置一个 tag

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