2015-12-17 106 views
1

我遇到了RecyclerView和RecyclerView.Adapter的問題。我有一個函數將項目列表設置到適配器中。當用戶刷卡刷新,我加載新的數據,這意味着一些項目是新的,然後我將項目設置到適配器,我必須使它們無效。我的問題是notifyItemRangeInserted()notifyItemRangeChanged()。當新項目出現時,如果我第一次刪除它們,然後notifyItemRangeRemoved(),然後添加並最終打電話notifyItemRangeInserted()它會工作,但所有項目都無效,並閃爍。否則,如果我確定新舊數據集之間的差異大小,則不會使適當的元素無效。Android RecyclerView適配器項刷新

public void setItems(@NonNull List<ItemType> items) { 
     final int oldSize = mItems.size(); 
     mItems.clear(); 
     notifyItemRangeRemoved(firstPosition(), oldSize); 
     mItems.addAll(items); 
     notifyItemRangeInserted(firstPosition(), items.size()); 
} 

mItems是ArrayList。

+0

什麼是'firstPosition'?\ – Blackbelt

+0

firstPosition()正在檢查適配器是否有標頭。如果頭部存在,則它將爲1,否則爲0.我通過執行notifyItemRangeInserted(firstPosition(),oldSize)來解決這個當前問題;'但是隻更新一小塊物品的問題在沒有先移除舊的項目,然後申請新的。這種方式閃爍將出現,但這是我目前的解決方案可以接受的。 – John

回答

0

解決方法是在適配器中使用hasStableIds(),以便適配器可以找出哪些項目發生更改。

1

你可以試試這個嗎?

myRecycleAdapter.notifyItemInserted(items.size());

你的方法將看起來像下面:

public void setItems(@NonNull List<ItemType> items) { 
    mItems.clear(); 
    mItems.addAll(items); 
    myRecycleAdapter.notifyItemInserted(items.size()); 

}

希望這會幫助你。

0

我想也許你是在反思這種情況。

到西仁的回答一樣,你可以:

public void setItems(@NonNull List<ItemType> items) { 
    mItems.clear(); 
    mItems.addAll(items); 
    myRecycleAdapter.notifyDataSetChanged(); } 

NotifyDataSetChanged既不會產生從當前位置的閃爍效果,也沒有更多的列表。