关于ListView中checkBox选中状态错乱问题的解决办法

 PS:提供这两种办法的人都没有解释到底是为什么错乱.下面来尝试分析一下:

  1:首先分析下viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener()…);

   这句话,就是给checkBox添加一个监听器,如果checkBox的状态改变了,那么系统就会自动回调里面的onCheckedChange()方法.

     而文中onCheckedChange()方法里写的是记录这次改变后checkBox状态的代码.

  2:再接着分析下if(list.get(position).type == A.TYPE_CHECKED){…},这部分代码是根据list集合里的对象属性初始化view里checkBox是否应该是选择状态.

  3:我上下滑动listView的时候,checkBox的状态就错乱了,根据第二点的分析,无论如何checkBox的状态都不会错乱,除非list集合里对象的属性已经被改变了,到底是什么地方改变了它?

  4:文中只有一个地方写了改变list集合里checkBox对象属性的地方,那就是第一点里提到的OnCheckedChangeListener()方法。它被执行了?

   怎么回事,不可能吧,打个断点,跑一下便知上下滑动listView的时候确实停了下来.

  5:这便是convertView的功能,因为不管listView里显示多少条数据,都只是共用那么几个对象,然后我们的代码每一次把得到的对象重新赋值而已。

   对了,正是在这赋值的时候出了问题,假设android系统给我们生成了10个共用view对象,第一个view对象在第一屏的时候需要显示成”未选择”状态,而到了第二屏的时候,却要显示成”选择”状态,但由于是共用的同一个对象,根据第一点得知当checkBox的状态改变的时候,会调用onCheckedChange()方法。

以下是在代码中的解决方案

package com.bawei.studentshop.adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import com.bawei.studentshop.R;
import com.bawei.studentshop.bean.ShoopCarResponse;

import java.util.List;

/**
 * Created by Administrator on 2016/7/15 0015.
 */
public class ShopCarAdapter extends BaseAdapter {
    private Context context;
    private List list;
    private int count = 0;

    public ShopCarAdapter(Context context, List list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = View.inflate(context, R.layout.shoopingcrtlist_item, null);
            holder.cb = (CheckBox) convertView.findViewById(R.id.cbCheckBox);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        //重点就是给每个CheckBox控件设置标记
        holder.cb.setTag(position);
        holder.cb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               //先把View转型为CheckBox
                 CheckBox c= (CheckBox) v;
                 //获取当前控件的Tag,即与其绑定的position
                int po = (int) c.getTag();
                //判断当前控件是否选中
                if (c.isChecked()) {
                //若选中,就根据绑定的position找到相对应的控件设置状态为turn
                    list.get(po).setCheck(true);
                }else{
                 //若未选中,就根据绑定的position找到相对应的控件设置状态为false
                    list.get(po).setCheck(false);
                }
            }
        });

        holder.cb.setChecked(list.get(position).isCheck());
        holder.title.setText(list.get(position).getName());
        holder.number.setText(list.get(position).getCid() + "");
        holder.price.setText("¥" + list.get(position).getCost());
        return convertView;
    }

    class ViewHolder {
        TextView title, number, price;
        ImageView goodsImg, jian, jia, jianTou;
        CheckBox cb;
    }
}

你可能感兴趣的:(关于ListView中checkBox选中状态错乱问题的解决办法)