安卓RecyclerView适配器项刷新

3
我遇到了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。


firstPosition 是什么? - Blackbelt
firstPosition() 函数检查适配器是否有标题。如果存在标题,则返回 1,否则返回 0。我通过执行 notifyItemRangeInserted(firstPosition(), oldSize); 解决了当前的问题,但是仅更新一小部分项目的问题没有解决,必须先删除旧项目,然后应用新项目。这样闪烁会出现,但对于我的当前解决方案来说是可以接受的。 - John
3个回答

1
请尝试这个吗?

myRecycleAdapter.notifyItemInserted(items.size());

您的方法将如下所示:

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

}

希望这能对你有所帮助。

0

我认为你可能过度思考了这个情况。

与Hiren的回答相似,你可以直接:

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

NotifyDataSetChanged 不会导致闪烁效果,也不会将您的列表从当前位置移动。


0
解决方案是在适配器中使用 hasStableIds() 方法,以便适配器可以找出哪些项目已更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接