2017-01-16 103 views
0

我有RecyclerView卡,我可以在位置0(頂部)添加並刪除列表中的任何卡。事情是,每張卡片都有一個「更多選項」按鈕,顯示每張卡片的PopupMenu參考。見截圖:
rc demo
事情是,如果我想要一個動畫,我需要使用adapter.notifyItemInserted(0)在添加,adapter.notifyItemRemoved(position)後刪除。但是,如果我不使用adapter.notifyDataSetChanged(),其他卡的ID將不會更新,如果我嘗試擴展PopupMenu或刪除任何其他卡,我會得到一個IndexOutOfBoundsException,因爲我試圖使用一個不存在的ID (在刪除卡的情況下)。RecyclerView添加/刪除動畫,同時保持ID的更新

總之,我期待通知RecyclerView的單個項目操作,同時保持整個RV卡更新。

我試圖adapter.notifyItemRangeChanged(0, arrayList.size())但它的作用一樣notifyDataSetChanged()

+0

然後很明顯你的ID是錯誤選擇的...其他ID不應該改變當你刪除一個項目(ID應該是穩定的) – Selvin

+0

@Selvin我不是手動設置ID 。 –

+0

如果您想獲得幫助,請顯示您的代碼。 – Divers

回答

1

在您的代碼中的任何地方使用holder.getAdapterPosition(),其中的操作是異步的或由事件啓動。在這種情況下,當像用戶點擊一樣的事件上調用異步回調時,傳遞到onBindViewHiolderposition將無效。在任何其他地方,使用通過的position是安全的。

只是要注意,adapter.notifyItemInserted(0)adapter.notifyItemRemoved(position)不會導致其他recyclerview是反彈。只是他們的觀點職位將被更新。這是爲了優化和之所以position陳舊

+0

感謝您的洞察力。它按預期工作。 –

2

我假設你正在使用參數位置在:

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
適配器

。嘗試使用

holder.getAdapterPosition() 

改爲。這應該可以解決你的問題。