簡體   English   中英

如何正確使用 RecyclerView.Adapter notifyItemInserted/Removed?

[英]How to use RecyclerView.Adapter notifyItemInserted/Removed in a right way?

例如,您有一個適配器,並在 onBindViewHolder 方法中將 OnClickListener 設置為某些視圖(並根據視圖位置在那里執行一些操作)。 您應該將final分配給方法 onBindViewHolder 的 position 參數,以便可以從 onClick() 訪問它。

更改數據集(刪除或添加列表中的項目)后,您調用 onItemInserted 或 onItemRemoved,這實際上在回收視圖中添加/刪除了一個視圖,但它不會刷新其他視圖,因此當您單擊相鄰視圖時,它將打開一個屏幕或顯示索引無效的數據。 為了避免這種情況,我基本上調用 notifyDatasetChanged 來調用 onBind 到所有可見視圖並刪除/添加一些視圖。

那么如何在調用 notifyItemInserted/removed 時刷新其他視圖,或者如何適當地使用這些方法?

如果插入或刪除數據集中的項而不調用notifyDataSetChangedonBindViewHolder位置分配給onBindViewHolder的變量將導致不一致的狀態。

要使用onItemInsertedonItemRemoved的數據應保持一致,因為它不會被重繪, onClick會在添加或刪除項目之前使用此無效位置。

對於此用例和其他用例, RecyclerView.ViewHolder提供了訪問其位置和id的方法:

使用getAdapterPosition()getItemId()來獲取有效位置和ID。

另請參閱RecyclerView.ViewHolder提供的其他方法。

所以,我解決問題的方法是將position更改為viewHolder.getAdapterPosition()

干杯!

我建議你在插入或刪除適配器內的列表后添加notifyItemRangeChanged。 這項工作適用於我的項目。

刪除項目中的示例:

public void removeItem (int pos) {        
        simpanList.remove(pos);
        notifyItemRemoved(pos);
        notifyItemRangeChanged(pos, simpanList.size());//add here, this can refresh position cmiiw
    }

對於未來的讀者,這就是我在 recyclerview 中插入/刪除時所做的例如,我的 model class 是CarsModel

在我的適配器中

    ArrayList<CarsModel> carsModel;

在 onBindViewHolder 中

    CardModel model = carsModel.get(position);

使用持有人中的按鈕刪除列表中的數據時:

    int position = holder.getAdapterPosition();
    carsModel.remove(position);
    notifyItemRemoved(position);

然后插入的時候

    carsModel.add(0, model);
    notifyItemInserted(0);

或插入最后一行

    carsModel.add(carsModel.size() - 1 , model);
    notifyItemInserted(carsModel.size()-1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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