Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在recyclerview中刷新行视图时发出_Android_Android Recyclerview_Notifydatasetchanged - Fatal编程技术网

Android 在recyclerview中刷新行视图时发出

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

我想在调用notifyItemChanged时更新recyclerview的视图。问题是我不想刷新整行,只想刷新该行的视图。(避免行的闪烁效果)

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


我能用它来实现吗?如果是,如何操作?

您可以使用此选项获取更新项目的视图:

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);