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

来源:互联网 发布:石青软件 编辑:程序博客网 时间:2024/06/02 12:23

 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<ShoopCarResponse.ListBean> list;    private int count = 0;    public ShopCarAdapter(Context context, List<ShoopCarResponse.ListBean> 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;    }}
0 0
原创粉丝点击