[英]Strange RecyclerView Checkbox onCheckChanged Behavior
我正在使用RecyclerView
項目中的復選框。 我知道它的一些問題。 但是,只有10個項目並且沒有滾動錯誤的監聽器被調用。
我有這樣的事情:
private class MyAdapter extends RecyclerView.Adapter<MyViewHodler> {
ArrayList<String> items;
ArrayList<String> checkedList = new ArrayList<>();
...
public void onBindViewHolder(final MyViewHolder holder, int position) {
String item = items.get(position);
String check = checkedList.get(item);
if(check != null)
holder.vChecked.setChecked(true);
else
holder.vChecked.setChecked(false);
....
holder.vChecked.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if (isChecked) {
checkedList.add(item);
} else {
checkedList.remove(item);
}
}
}
}
現在,奇怪的是這個checkedChange調用是在不同的視圖上進行的。 我有一個只有10個項目的列表,適合在recyclerview中,沒有滾動。 我從外部更改數據(項目和檢查列表),設置新數據並調用myAdapter.notifyDatasetChanged()
此調用從已檢查狀態中刪除另一個項目。
例如,我檢查了10個項目。 我取消選中1個項目,並根據它進行一些其他計算並調用myAdapter.notifyDatasetChanged()
。 它還會從其他9個項目中取消另外一個元素。
所以,即使沒有滾動,為什么onCheckedChange監聽器被調用錯誤的視圖?
我發現了問題。 我認為為每個視圖調用onBindViewHolder
來更改數據。 但是我錯了。
notifyDatasetChanged()
回收屏幕上的所有視圖持有者,並從循環視圖持有者池中隨機選擇視圖來綁定新數據。 因此,當我調用notifyDatasetChanged
,視圖使用者位於不同的位置,因此更改了一個項目。
因此,我在回收器視圖的onViewRecycled
方法中將偵聽器移除為null。 像這樣:
@Override
public void onViewRecycled(MyViewHolder holder) {
super.onViewRecycled(holder);
holder.vChecked.setOnCheckedChangeListener(null);
}
這確實解決了這個問題。 我知道這一點,但我認為如果沒有滾動,查看器會被重用於相同的位置。 但onDatasetChanged
回收所有當前使用的視圖持有者,並從隨機池中再次使用它。
這一行: String item = items.get(item);
這讓我很煩。 不應該是String item = items.get(position);
編輯:如果更改數據集的一個位置,請調用notifyItemChanged。 除非完全更改,否則不要通知整個數據集。 可能是這個。
編輯2:那么問題不在於在錯誤的視圖上調用onCheckedChanged。 它在所有視圖中調用,因為您始終在onBindViewHolder
更改復選框狀態
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.