在工作中有時會遇到含有CheckBox 的ListView/Recyclerview時,發現當初始化CheckBox的狀態後, 滾動ListView/Recyclerview,其中CheckBox 的選中狀態不停的發生變化。最後發現原因 是ListView/Recyclerview滾動時自動調用 onCheckedChanged 導致的。
解決辦法是在自定義的Adapter的getView/onBindViewHolder方法中這樣寫就行了。
//在初始化CheckBox狀態和設置狀態變化監聽事件之前,先把狀態變化監聽事件設置爲null
holder.checkBox.setOnCheckedChangeListener(null);
//然後設置CheckBox狀態
if(isChecked) {
holder.checkbox.setChecked(true);
} else {
holder.checkbox.setChecked(false);
}
//然後設置狀態變化監聽事件
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
//...
}else{
//....
}
}
});
分析:
1、CheckBox在執行setChecked時會觸發OnCheckedChange處理程序;
2、Adapter採用的是控件重用機制,就是當列表往上下拖時,那些被拖出屏幕外的控件會重用,由於該item獲取到的數據項(dataList.get(index))往往使用了final,所以在執行CheckBox.setChecked(true/false); 觸發該控件的OnCheckedChange處理程序,而這個處理程序指向的數據項是前一次綁定的那行數據,這樣就可能導致dataList中的某個數據被意外修改,進而引起程序行爲的不確定。