http://blog.csdn.net/aiaifei/article/details/52119140 解決不斷刷新問題
今天在項目中遇到了需要在recycleview中添加checkbox的,并且每次只能勾選一個,勾中當(dāng)前項時灸姊,需要將上一個變未勾中狀態(tài)。
一秉溉、思路
一.建立一個集合力惯,負(fù)責(zé)保存被選中的item
二.當(dāng)勾中一個checkbox時
1.如果是勾中該對象,將集合清空(保證只有一個被選中的item)召嘶,講數(shù)據(jù)加入選中集合父晶。觸發(fā)回調(diào)(負(fù)責(zé)刷新界面)
2.如果是取消,從集合中清楚弄跌。
3.checkbox的情況根據(jù)集合中是否包含該數(shù)據(jù)來判斷
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));
//當(dāng)有新的選中時 其他的都置成未選中狀態(tài)
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);
}
刷新界面
由回調(diào)觸發(fā)刷新界面的操作甲喝,因為使用的是recycleview,并且事件寫在了onBindViewHolder中铛只。這個方法是用來刷新每一個recycler item的埠胖。所以在onBindViewHolder里的某些組件里的事件方法做notifyDataSetChanged糠溜,onBindViewHolder就會頻繁執(zhí)行。解決方案是延時1s直撤,觸發(fā)刷新的方法非竿。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
}
},1000);
還有一種通過標(biāo)志位解決的方法在stackoverflow中