概述
??今天用recyclerview時(shí)候發(fā)現(xiàn)checkbox重復(fù)使用會(huì)導(dǎo)致OnCheckedChangeListener 出現(xiàn)一個(gè)不太友好的問題掺栅,問題是這樣的:Recyclerview 會(huì)回收使用組件刀疙,回收checkbox的時(shí)候會(huì)觸發(fā)OnCheckedChangeListener 事件,導(dǎo)致我們寫的listener中的邏輯會(huì)被打亂漠嵌。
??比如我選中了一個(gè)checkbox,那么當(dāng)view滾動(dòng)導(dǎo)致這個(gè)checkbox 滑動(dòng)出可視范圍的時(shí)候 猖腕,OnCheckedChangeListener事件會(huì)被觸發(fā),這樣相當(dāng)于自動(dòng)把我選中的取消了放接。
采用解決方法:
//在初始化checkBox狀態(tài)和設(shè)置狀態(tài)變化監(jiān)聽事件之前先把狀態(tài)變化監(jiān)聽事件設(shè)置為null
holder.checkBox.setOnCheckedChangeListener(null);
//然后設(shè)置CheckBox狀態(tài)
if(isChecked){
holder.checkbox.setChecked(true);
}else{
holder.checkbox.setChecked(false);
}
//然后設(shè)置狀態(tài)變化監(jiān)聽事件
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListen
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){
if(isChecked){
//...
}else{
//...
}
}
});
分析
1.CheckBox在執(zhí)行setChecked時(shí)會(huì)觸發(fā)OnCheckedChange處理程序留特;
2.Adapter采用的是控件重用機(jī)制纠脾,就是當(dāng)列表往上下拖時(shí),那些被拖出屏幕外的控件會(huì)重用磕秤,由于該item獲取到的數(shù)據(jù)項(xiàng)(dataList.get(index))往往使用了final乳乌,所以在執(zhí)行CheckBox.setChecked(true/false); 觸發(fā)該控件的OnCheckedChange處理程序,而這個(gè)處理程序指向的數(shù)據(jù)項(xiàng)是前一次綁定的那行數(shù)據(jù)市咆,這樣就可能導(dǎo)致dataList中的某個(gè)數(shù)據(jù)被意外修改汉操,進(jìn)而引起程序行為的不確定。
參考文章
https://blog.csdn.net/jdsjlzx/article/details/52426868
https://blog.csdn.net/nerver87/article/details/51291337
End
筆者的Github Blog蒙兰,希望各位大大提意見磷瘤,點(diǎn)個(gè)star,謝謝
傳送門:WusyBlog求互粉互贊搜变,互贊所有文章可以私聊我采缚。哈哈,希望我們的原創(chuàng)文章能讓更多朋友看到挠他,一起變強(qiáng)扳抽。
筆者新開通了微信公眾號——飲水思源|wusy 計(jì)劃持續(xù)運(yùn)營,每日為您分享Android干貨殖侵、原創(chuàng)文章贸呢。微信掃描下方的二維碼關(guān)注我,開發(fā)學(xué)習(xí)路上不迷路拢军。謝謝各位