android ListView/Recyclerview滾動時自動調用onCheckedChanged導致CheckBox狀態混亂的解決辦法

在工作中有時會遇到含有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中的某個數據被意外修改,進而引起程序行爲的不確定。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章