RecyclerView与CheckBox结合使用错乱问题

RecyclerView是当前流行的数据视图展示框架

但是,当我们使用RecyclerView与CheckBox结合使用时,碰撞出了勾选错乱的火花

那么接下来我们就来粗暴的解决掉这个小火星


首先,我们来看代码

private Context context;
private List<MyBean> list;
//首先我们要实例化一个SparseBooleanArray,这个集合对象是Android官方自带的,想了解的可以了解一下
https://www.sogou.com/sie?hdq=AQxRG-0000&query=SparseBooleanArray&ie=utf8
private SparseBooleanArray mCheckStates=new SparseBooleanArray();


//适配器
public MyAdapter(Context context, List<MyBean> list) {
    this.context = context;
    this.list = list;
}
  //在onCreateView中基本没什么变化
 
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view= LayoutInflater.from(context).inflate(R.layout.iten_shop,null);
    MyViewHolder myViewHolder=new MyViewHolder(view);
    return myViewHolder;
}

 
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
    
   holder.cb.setTag(position);//在最开始适配的时候,将每一个CheckBox设置一个当前的Tag值,这样每个CheckBox都有了一个固定的标识
   holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isCheckBox) {
                int pos= (int) buttonView.getTag();//得到当前CheckBox的Tag值,由于之前保存过,所以不会出现索引错乱
                if (isCheckBox){
                    //点击时将当前CheckBox的索引值和Boolean存入SparseBooleanArray中
                    mCheckStates.put(pos,true);
                }else {
                   //否则将 当前CheckBox对象从SparseBooleanArray中移除
                    mCheckStates.delete(pos);                  
                }
            }
        });
    //得到CheckBox的Boolean值后,将当前索引的CheckBox状态改变
    holder.cb.setChecked(mCheckStates.get(position,false));
        if(holder.cb.isChecked()){
            System.out.println("==选中了=");
        }else{
            System.out.println("==取消了=");
        }

}
 
 
class MyViewHolder extends RecyclerView.ViewHolder{

    private final CheckBox cb;

    public MyViewHolder(View itemView) {
        super(itemView);
        cb = itemView.findViewById(R.id.ckb_dan);

    }
}

 
 
 ----至此,CheckBox错乱问题完美解决了,怎么样,是不是很简单
相关文章
相关标签/搜索