在项目中需要用到recycler View以及CheckBox,但是在勾选check后上下滑动recycler view时checkbox出现混乱了,debug了下,发现是因为在上下滑动recycler View时,当你的item很多时向上或向下拉时它的item重新绘制了,所以导致check选择混乱。
我在百度上找了下,我觉得可以的check.setTag,看代码:
private HashMap hashMap = new HashMap();
private SparseBooleanArray mCheckStates=new SparseBooleanArray();//用于存放选择的状态
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int i) {
viewHolder.checkBox.setTag(i);//在最开始适配的时候,将每一个CheckBox设置一个当前的Tag值,这样每个CheckBox都有了一个固定的标识
setCheck_true(viewHolder,i);
}
//单选
private void setCheck_true(final ViewHolder viewHolder, final int i){
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int pos= (int) buttonView.getTag();//得到当前CheckBox的Tag值,由于之前保存过,所以不会出现索引错乱
if (isChecked){
//点击时将当前CheckBox的索引值和Boolean存入SparseBooleanArray中
if (hashMap.size()<num){
mCheckStates.put(pos,true);
hashMap.put(pos,pos);
}else if (mCheckStates.get(i,false)==false){
viewHolder.checkBox.setChecked(false);
ToastUtil.showToast((Activity) context,"金币数不足",1500);
}
}else {
viewHolder.checkBox.setClickable(true);
//否则将 当前CheckBox对象从SparseBooleanArray中移除
mCheckStates.delete(pos);
hashMap.remove(pos);
}
}
});
//得到CheckBox的Boolean值后,将当前索引的CheckBox状态改变
viewHolder.checkBox.setChecked(mCheckStates.get(i,false));
}
这样子在上下滑动时,遇到Viewholder重新绘制时,就会去mCheckStates中获取该位置的check的状态;
做完这些后,觉得不完善就去加了个限制check的点击数量,无论是单个点击还是全选都必须在这个数量内,之间无论用check。setChecked(false)都没用,因为在上下滑动recycler时,item又重新绘制了,每次在item0点击了但是在刷新下一页时,下一页的第一个也被点击了,我就去设定一个(int count=0)每次点击时,自增,取消时自减,但还是不行在recycler重新绘制时count 在新绘制的地方(count=0)拉recycler到先前的位置,count还是先前自增的数量,pass。
于是我就用hashmap来存放点击的item的position:hash.put(position,position);然后在点击时判断(hash.size<num)然后在else if中判断(mCheckStates.get(i,false)==false),
mCheckStates.get(i,false)==true:则说明该item的 check是true;mCheckStates.get(i,false)==false:说明该item没被点击,但是它(checkbox)在重绘时会被shecheck(true),所以需要
viewHolder.checkBox.setChecked(false);
看代码:
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int pos= (int) buttonView.getTag();//得到当前CheckBox的Tag值,由于之前保存过,所以不会出现索引错乱
if (isChecked){
//点击时将当前CheckBox的索引值和Boolean存入SparseBooleanArray中
if (hashMap.size()<num){
mCheckStates.put(pos,true);
hashMap.put(pos,pos);
}else if (mCheckStates.get(i,false)==false){
viewHolder.checkBox.setChecked(false);
ToastUtil.showToast((Activity) context,"金币数不足",1500);
}
}else {
viewHolder.checkBox.setClickable(true);
//否则将 当前CheckBox对象从SparseBooleanArray中移除
mCheckStates.delete(pos);
hashMap.remove(pos);
}
}
});
//得到CheckBox的Boolean值后,将当前索引的CheckBox状态改变
viewHolder.checkBox.setChecked(mCheckStates.get(i,false));