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中