如何在 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++;
当您单击按钮时,它会获得对应于该位置的 TextView..
在 OnClick
按钮处,获取您单击的位置的 TextView..
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();
}
我的 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++;
当您单击按钮时,它会获得对应于该位置的 TextView..
在
OnClick
按钮处,获取您单击的位置的 TextView..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();
}