簡體   English   中英

奇怪的RecyclerView Checkbox onCheckChanged行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM