http://blog.csdn.net/aiaifei/article/details/52119140 解决不断刷新问题
今天在项目中遇到了需要在recycleview中添加checkbox的,并且每次只能勾选一个,勾中当前项时,需要将上一个变未勾中状态。
一、思路
一.建立一个集合,负责保存被选中的item
二.当勾中一个checkbox时
1.如果是勾中该对象,将集合清空(保证只有一个被选中的item),讲数据加入选中集合。触发回调(负责刷新界面)
2.如果是取消,从集合中清楚。
3.checkbox的情况根据集合中是否包含该数据来判断
holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{ @Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked && mChoseData.size() > 0)
{
mChoseData.clear();
}
//加入选中的集合
mChoseData.add(mData.get(position));
//当有新的选中时 其他的都置成未选中状态
if (isChecked) {
mData.get(position).setCheck(isChecked);
mCheckListener.OnItemCheck(mData.get(position),position);
} else {
mChoseData.remove(mData.get(position));
}
}
});
holder.mCheckBox.setTag(mData.get(position));
if (mChoseData.contains(mData.get(position)))
holder.mCheckBox.setChecked(true);
else {
holder.mCheckBox.setChecked(false);
}
刷新界面
由回调触发刷新界面的操作,因为使用的是recycleview,并且事件写在了onBindViewHolder中。这个方法是用来刷新每一个recycler item的。所以在onBindViewHolder里的某些组件里的事件方法做notifyDataSetChanged,onBindViewHolder就会频繁执行。解决方案是延时1s,触发刷新的方法。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
}
},1000);
还有一种通过标志位解决的方法在stackoverflow中