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 对象。