我遇到了RecyclerView和RecyclerView.Adapter的问题。我有一个函数,它将项目列表设置到适配器中。当用户刷卡到刷新时,我加载新数据,这意味着一些项目是新的,然后我将项目设置为适配器,我必须使它们无效。我的问题在于notifyItemRangeInserted()
和notifyItemRangeChanged()
。当新项目出现时,如果我先删除它们,然后notifyItemRangeRemoved()
,然后添加并最终调用notifyItemRangeInserted()
它会起作用,但所有项目都会失效并且会闪烁。否则,如果我确定新旧数据集之间的差异大小,则不会使适当的元素无效。
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 :(得分:1)
你能试试这个吗?
myRecycleAdapter.notifyItemInserted(items.size());
您的方法如下所示:
Windows 64 bit
}
希望这会对你有所帮助。
答案 1 :(得分:0)
我想也许你正在过度思考这种情况。
与Hiren的答案类似,你可以:
public void setItems(@NonNull List<ItemType> items) {
mItems.clear();
mItems.addAll(items);
myRecycleAdapter.notifyDataSetChanged(); }
NotifyDataSetChanged既不会导致闪烁效果,也不会导致列表的当前位置更多。
答案 2 :(得分:0)
解决方案是在适配器中使用hasStableIds()
,以便适配器可以找出更改的项目。