![](/img/trans.png)
[英]How to use SharedPreferences in RecyclerView.Adapter in Kotlin?
[英]How to use RecyclerView.Adapter notifyItemInserted/Removed in a right way?
例如,您有一個適配器,並在 onBindViewHolder 方法中將 OnClickListener 設置為某些視圖(並根據視圖位置在那里執行一些操作)。 您應該將final
分配給方法 onBindViewHolder 的 position 參數,以便可以從 onClick() 訪問它。
更改數據集(刪除或添加列表中的項目)后,您調用 onItemInserted 或 onItemRemoved,這實際上在回收視圖中添加/刪除了一個視圖,但它不會刷新其他視圖,因此當您單擊相鄰視圖時,它將打開一個屏幕或顯示索引無效的數據。 為了避免這種情況,我基本上調用 notifyDatasetChanged 來調用 onBind 到所有可見視圖並刪除/添加一些視圖。
那么如何在調用 notifyItemInserted/removed 時刷新其他視圖,或者如何適當地使用這些方法?
如果插入或刪除數據集中的項而不調用notifyDataSetChanged
, onBindViewHolder
位置分配給onBindViewHolder
的變量將導致不一致的狀態。
要使用onItemInserted
或onItemRemoved
的數據應保持一致,因為它不會被重繪, 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.