Android 在recyclerview中刷新行视图时发出
我想在调用notifyItemChanged时更新recyclerview的视图。问题是我不想刷新整行,只想刷新该行的视图。(避免行的闪烁效果) 有一个名为notifyItemChanged(int,payload obj)的方法Android 在recyclerview中刷新行视图时发出,android,android-recyclerview,notifydatasetchanged,Android,Android Recyclerview,Notifydatasetchanged,我想在调用notifyItemChanged时更新recyclerview的视图。问题是我不想刷新整行,只想刷新该行的视图。(避免行的闪烁效果) 有一个名为notifyItemChanged(int,payload obj)的方法 我能用它来实现吗?如果是,如何操作?您可以使用此选项获取更新项目的视图: View v = recyclerView.getLayoutManager().findViewByPosition(position); if (v != null){ //upda
我能用它来实现吗?如果是,如何操作?您可以使用此选项获取更新项目的视图:
View v = recyclerView.getLayoutManager().findViewByPosition(position);
if (v != null){
//update your view
}
假设您有一个项目的数组列表,它被馈送到RecyclerView适配器。就这样吧
List<String> items = new ArrayList<>();
RecyclerAdapter adapter = new RecyclerAdapter(items);
recyclerView.setAdapter(adapter);
这意味着,适配器将在0位置用新值更新recyclerview。最后我找到了如何仅更新recyclerview中某行的特定视图
recyclerView.setItemAnimator(null);
(1) 覆盖适配器中的onBindViewHolder(Recycler.ViewHolder VH,int位置,列出有效载荷)
(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位置,对象负载)。需要将customObject(保存数据的模型)作为有效负载对象传递
adapter.notifyItemChanged(i, obj);
注意:需要禁用RecyclerView的ItemAnimator(默认情况下已启用)。否则有效负载对象将为空。
recyclerView.setItemAnimator(null);
或
更新:我最近在没有禁用ItemAnimator的情况下使用了此方法。所以不需要禁用ItemAnimator(recyclerview-v7:25.4.0)
你试过什么了吗?你能给我们看一些代码吗,比如你的recyclerview适配器?不要插入项目。我需要更改数组列表中已经存在的项,而不是调用notifyItemInserted(int位置)调用notifyItemChaged(int位置)。我已经更新了答案。是的,我已经在做了。但它会刷新整行,导致闪烁效果。我只想通过刷新T行的特定视图来避免这种情况。是否再次调用setAdapter()方法?否,只需更改对象的布尔值并调用notifyItemChanged。我调试了它,它再次通过onBindViewHolder,并再次将数据重置为视图。非常好。这个问题让我头疼,因为它创建了两个视图持有者,尽管我只想通过
NotifiItemChanged
Perfect更改一个项目。这就是我想要的。
((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);