如何在RecyclerView的notifyDataSetChanged中使指定项不更新

3

我有一个在RecyclerView中的项,当我调用notifyDataSetChanged时不需要更新。

但是我没有找到任何方法来使指定的项避免更新。这可能吗?


我需要这样做是因为该项是一个WebView,它已经加载了一个HTML页面。如果我调用notifyDataSetChanged,这个项将会闪烁。

我提出这个问题的原因是避免notifyDataSetChangedWebView的闪烁(请参见这个问题)。在尝试使用notifyItemRangeXXX方法失败后,我提出了这个问题。

但是在查看您的答案和评论后,似乎在使用notifyDataSetChanged时无法避免更新。


1
如果您不想更新数据源,请不要更改它。 - Linh
如果可行的话,您可以使用notifyItemChanged(pos)来更新除了当前项以外的其他项。 - Shaishav
如果你正在使用RecyclerView.Adapter,你可能需要考虑使用notifyItemChanged(int position)和notifyItemRangeChanged(int positionStart, int itemCount)方法。 - Keyfe Ang
3个回答

5
是的,实际上可以这样做。 notifyDataSetChanged() 会通知 RecyclerView 数据集中所有元素都已更改
由于您不希望发生这种情况并排除特定项。
for(int i = 0; i< mAdapter.getItemCount(); i++){
    if(i != itemPositionToExclude){
       mAdapter.notifyItemChanged(i);
    }
}

所以,我们需要循环遍历适配器中的所有元素,并且只为那些你不想排除的位置调用notifyItemChanged()

3

notifyDataSetChanged的目的是更新所有项目。如果您不想要这种行为,请不要使用它!

正确的方法是仅更新您已更改的数据。有一些方法可以帮助您仅使所需数据无效:

notifyItemChanged(int position)
notifyItemInserted(int position)
notifyItemMoved(int fromPosition, int toPosition)
notifyItemRangeChanged(int positionStart, int itemCount)
notifyItemRangeRemoved(int positionStart, int itemCount)
notifyItemRemoved(int position)

1
你应该以不同的方式思考——哪些项目需要更新。在数据发生变化后,使用 notifyitemchanged 方法来更新项目的 UI。

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