getView(...) 中的 ListView 位置问题
ListView Position Issue in getView(...)
我在 ListView 中有三个项目,在每个列表项目上我有三个 TextView,一个包含项目价格,第二个显示数量,第三个显示该项目的总计。
还有两个TextView,一个增加数量,第二个减少数量。
现在的问题是,每当我更改第一个或第二个列表项的数量时,它都会影响第三个列表项(即列表中的最后一个项目)的数量和总量
public class CartAdapter extends BaseAdapter {
ViewHolder holder;
......
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// convert view = design
View v = convertView;
if (v == null) {
holder = new ViewHolder();
v = layoutInflater.inflate(Resource, null);
holder.textViewPrice = (TextView) v.findViewById(R.id.textPrice);
holder.editTextQuantity = (EditText) v.findViewById(R.id.editQuantity);
holder.textViewTotal = (TextView) v.findViewById(R.id.textTotal);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
holder.textViewPrice.setText("$ " +cartArrayList.get(Integer.parseInt(holder.textViewPrice.getTag())).getPrice());
cart = cartArrayList.get(Integer.parseInt(v.getTag()));
holder.editTextQuantity.setText(String.valueOf(cart.getQuantity()));
df = new DecimalFormat("0.00##");
totalPrice = cart.getQuantity() * cart.getPrice();
cart.setTotal(totalPrice);
holder.textViewTotal.setText("$ " + df.format(cart.getTotal()));
return v;
}
试试这个方法
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// convert view = design
View v = convertView;
if (v == null) {
holder = new ViewHolder();
v = layoutInflater.inflate(Resource, null);
holder.textViewPrice = (TextView) v.findViewById(R.id.textPrice);
holder.editTextQuantity = (EditText) v.findViewById(R.id.editQuantity);
holder.textViewTotal = (TextView) v.findViewById(R.id.textTotal);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
v.setTag("ID",position);
holder.textViewPrice.setTag(position);
holder.editTextQuantity.setTag(position);
holder.textViewTotal.setTag(position);
holder.textViewPrice.setText("$ " +cartArrayList.get(Integer.parseInt(holder.textViewPrice.getTag())).getPrice());
cart = cartArrayList.get(Integer.parseInt(v.getTag()));
holder.editTextQuantity.setText(String.valueOf(cart.getQuantity()));
df = new DecimalFormat("0.00##");
totalPrice = cart.getQuantity() * cart.getPrice();
cart.setTotal(totalPrice);
holder.textViewTotal.setText("$ " + df.format(cart.getTotal()));
return v;
}
您的基本适配器中只有一个 holder 变量。每次调用 getView() 时它都会更新。问题是您的点击监听器正在使用该 holder 变量来更新视图。由于持有者现在指向创建的最后一个视图项,因此它是在 onClick 中更新的视图项。
解决该问题的一个简单方法是创建一个最终的 ViewHolder 变量并在 onClicks 中使用它。您可以对两个 OnClickListeners 使用相同的变量。
像这样..
final ViewHolder perItemHolder = holder;
holder.textQtyIncrease.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(p == 9) {
Toast.makeText(context, "You have reached to maximum order quantity", Toast.LENGTH_LONG).show();
return ;
}
else {
p = p+1;
perItemHolder.textViewQuantity.setText(""+p);
totalPrice = p * cart.getPrice();
cart.setTotal(totalPrice);
perItemHolder.textViewTotal.setText("$ " + df.format(cart.getTotal()));
}
}
});
在 getView
方法开始时初始化您的 ViewHolder
对象。
我在 ListView 中有三个项目,在每个列表项目上我有三个 TextView,一个包含项目价格,第二个显示数量,第三个显示该项目的总计。
还有两个TextView,一个增加数量,第二个减少数量。
现在的问题是,每当我更改第一个或第二个列表项的数量时,它都会影响第三个列表项(即列表中的最后一个项目)的数量和总量
public class CartAdapter extends BaseAdapter {
ViewHolder holder;
......
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// convert view = design
View v = convertView;
if (v == null) {
holder = new ViewHolder();
v = layoutInflater.inflate(Resource, null);
holder.textViewPrice = (TextView) v.findViewById(R.id.textPrice);
holder.editTextQuantity = (EditText) v.findViewById(R.id.editQuantity);
holder.textViewTotal = (TextView) v.findViewById(R.id.textTotal);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
holder.textViewPrice.setText("$ " +cartArrayList.get(Integer.parseInt(holder.textViewPrice.getTag())).getPrice());
cart = cartArrayList.get(Integer.parseInt(v.getTag()));
holder.editTextQuantity.setText(String.valueOf(cart.getQuantity()));
df = new DecimalFormat("0.00##");
totalPrice = cart.getQuantity() * cart.getPrice();
cart.setTotal(totalPrice);
holder.textViewTotal.setText("$ " + df.format(cart.getTotal()));
return v;
}
试试这个方法
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// convert view = design
View v = convertView;
if (v == null) {
holder = new ViewHolder();
v = layoutInflater.inflate(Resource, null);
holder.textViewPrice = (TextView) v.findViewById(R.id.textPrice);
holder.editTextQuantity = (EditText) v.findViewById(R.id.editQuantity);
holder.textViewTotal = (TextView) v.findViewById(R.id.textTotal);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
v.setTag("ID",position);
holder.textViewPrice.setTag(position);
holder.editTextQuantity.setTag(position);
holder.textViewTotal.setTag(position);
holder.textViewPrice.setText("$ " +cartArrayList.get(Integer.parseInt(holder.textViewPrice.getTag())).getPrice());
cart = cartArrayList.get(Integer.parseInt(v.getTag()));
holder.editTextQuantity.setText(String.valueOf(cart.getQuantity()));
df = new DecimalFormat("0.00##");
totalPrice = cart.getQuantity() * cart.getPrice();
cart.setTotal(totalPrice);
holder.textViewTotal.setText("$ " + df.format(cart.getTotal()));
return v;
}
您的基本适配器中只有一个 holder 变量。每次调用 getView() 时它都会更新。问题是您的点击监听器正在使用该 holder 变量来更新视图。由于持有者现在指向创建的最后一个视图项,因此它是在 onClick 中更新的视图项。
解决该问题的一个简单方法是创建一个最终的 ViewHolder 变量并在 onClicks 中使用它。您可以对两个 OnClickListeners 使用相同的变量。
像这样..
final ViewHolder perItemHolder = holder;
holder.textQtyIncrease.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(p == 9) {
Toast.makeText(context, "You have reached to maximum order quantity", Toast.LENGTH_LONG).show();
return ;
}
else {
p = p+1;
perItemHolder.textViewQuantity.setText(""+p);
totalPrice = p * cart.getPrice();
cart.setTotal(totalPrice);
perItemHolder.textViewTotal.setText("$ " + df.format(cart.getTotal()));
}
}
});
在 getView
方法开始时初始化您的 ViewHolder
对象。