在RecyclerView中刷新某一行视图的问题

7

当调用notifyItemChanged方法时,我想更新recyclerview的视图。问题是我不想刷新整个行而只是行的视图。(以避免行的闪烁效果)

有一个名为notifyItemChanged(int,payload obj)的方法。

我可以使用它来实现吗?如果可以,如何做到呢?


1
你有尝试过什么吗?能否给我们展示一些代码,例如你的RecyclerView适配器? - hehe
3个回答

17

最终我找到了如何仅更新RecyclerView中某行的特定视图。

(1) 在适配器中重写onBindViewHolder(Recycler.ViewHolder VH, int position, List payloads)

(2) 在该方法中,

if(payloads != null && !payloads.isEmpty() && (payloads.get(0) instanceof  customObject)){
   // update the specific view
}else{
   // I have already overridden  the other onBindViewHolder(ViewHolder, int)
   // The method with 3 arguments is being called before the method with 2 args. 
   // so calling super will call that method with 2 arguments. 
   super.onBindViewHolder(holder,position,payloads);
}

(3) 因此,要通知数据更改并更新视图,需要调用 notifyItemChanged(int position, Object payload)。需要将自定义对象(保存数据的模型)作为payload对象传递。

adapter.notifyItemChanged(i, obj);

注意:需要禁用 RecyclerView 的 ItemAnimator(默认情况下是启用的)。否则,有效载荷对象将为空。

recyclerView.setItemAnimator(null);
或者
((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);

更新:最近我使用了这种方法而不必禁用ItemAnimator,因此不需要禁用ItemAnimator。(recyclerview-v7:25.4.0)

更多参考资料


非常好。这个问题让我头疼,因为它创建了两个ViewHolders,尽管我只想通过notifiyItemChanged更改一个项目。 - ono
完美。这就是我想要的。 - Rhusfer

3
你可以使用这个方法来获取更新后的视图:
View v = recyclerView.getLayoutManager().findViewByPosition(position);
if (v != null){
    //update your view
}

0
假设您有一个项目ArrayList,并将其提供给RecyclerView适配器。让它像这样。
List<String> items = new ArrayList<>();
RecyclerAdapter adapter = new RecyclerAdapter(items);
recyclerView.setAdapter(adapter);

现在我看到你想要将项目插入到RecyclerView中,并调用notifyItemChanged(int position)方法仅添加单个项目。

为此,假设您已更改了列表中位置0的项目的值。那是列表中的第一项。

现在,正确使用notifyItemChanged(int position)方法的方式是

adapter.notifyItemChanged(0);

这意味着,适配器将使用0位置的新值更新recyclerview。


不是插入一个项目。我需要更改数组列表中已经存在的项目。 - chathura
然后,不要调用notifyItemInserted(int position),而是调用notifyItemChanged(int position)。我已经更新了答案。 - capt.swag
是的,我已经在做了。但是它会刷新整行,导致闪烁效果。我希望通过只刷新特定的行视图来避免这种情况。 - chathura
你又调用了setAdapter()方法吗? - capt.swag
不,只需更改对象的布尔值并调用notifyItemChanged即可。我进行了调试,它会再次通过onBindViewHolder并将数据重置到视图中。 - chathura

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