刷新 recyclerview 中一行的视图
Issue refreshing a view of a row in recyclerview
我想在调用 notifyItemChanged 时更新 recyclerview 的视图。问题是我不想刷新整行,而只想刷新该行的视图。 (避免行的闪烁效果)
有一个名为 notifyItemChanged(int, payload obj) 的方法。
我可以用它来实现吗?如果是怎么办?
您可以使用它来获取更新项目的视图:
View v = recyclerView.getLayoutManager().findViewByPosition(position);
if (v != null){
//update your view
}
假设您有一个 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。
我终于找到了如何只更新 RecyclerView 中一行的特定视图。
(1) 在适配器中覆盖 onBindViewHolder(Recycler.ViewHolder VH, int position, List payloads)
(2) 在 onBindViewHolder 方法中,
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)。需要将 customObject(保存数据的模型)作为有效负载对象传递。
adapter.notifyItemChanged(i, obj);
注意:需要关闭RecyclerView的ItemAnimator(默认开启)。否则负载对象将为空。
recyclerView.setItemAnimator(null);
或
((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
更新:我最近在没有禁用 ItemAnimator 的情况下使用了这个方法。所以不需要禁用 ItemAnimator。 - (recyclerview-v7:25.4.0)
我想在调用 notifyItemChanged 时更新 recyclerview 的视图。问题是我不想刷新整行,而只想刷新该行的视图。 (避免行的闪烁效果)
有一个名为 notifyItemChanged(int, payload obj) 的方法。
我可以用它来实现吗?如果是怎么办?
您可以使用它来获取更新项目的视图:
View v = recyclerView.getLayoutManager().findViewByPosition(position);
if (v != null){
//update your view
}
假设您有一个 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。
我终于找到了如何只更新 RecyclerView 中一行的特定视图。
(1) 在适配器中覆盖 onBindViewHolder(Recycler.ViewHolder VH, int position, List payloads)
(2) 在 onBindViewHolder 方法中,
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)。需要将 customObject(保存数据的模型)作为有效负载对象传递。
adapter.notifyItemChanged(i, obj);
注意:需要关闭RecyclerView的ItemAnimator(默认开启)。否则负载对象将为空。
recyclerView.setItemAnimator(null);
或
((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
更新:我最近在没有禁用 ItemAnimator 的情况下使用了这个方法。所以不需要禁用 ItemAnimator。 - (recyclerview-v7:25.4.0)