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错乱问题完美解决了,怎么样,是不是很简单