问题标签 [android-diffutils]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
32 浏览

android - 如果它的适配器使用对由单独类管理的 MutableListView 的引用,我真的需要 DiffUtil.ItemCallback 来更新我的 RecyclerView 吗?

假设我有一个 RecyclerView 的适配器,如下所示:

data此适配器的构造函数中的变量引用MutableList<ContentModel>由另一个类管理的 a,即BaseMediaListPagingPresenter

更具体地说,dataContent在上面。同时,实现 的 FragmentPagingAdapterInterface具有以下实现notifyItemsInserted

adapter是 ContentAdapter 实例。

由于DiffUtil.ItemCallback似乎是为数据交换而不是附加而设计的,因此使用此设置,我真的需要DiffUtil.ItemCallback吗?

(我是否需要 PagedList 代替?)

0 投票
1 回答
1446 浏览

android - 协程、异步 DiffUtil 和不一致检测错误

我无法将 Kotlin Flows 和异步 DiffUtil 放在一起。

我的 RecyclerView.Adapter 中有这个函数,它在计算线程上计算 DiffUtil 并将更新发送到主线程上的 RecyclerView:

我像这样从我的 Fragment 调用这个函数:

updateConversationsList()在很短的时间内被多次调用,因为这个函数是由 Kotlin 的Flowslike调用的Flow<Conversation>

现在有了所有这些,我有时会遇到java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder错误。阅读这个线程我知道这是一个线程问题,我已经阅读了很多这样的推荐更新适配器数据集的线程和向 RecyclerView 分派更新的线程必须相同。

如您所见,我已经通过以下方式尊重了这一点:

由于主线程,只有它,这两个操作,我怎么可能得到这个错误?

0 投票
1 回答
456 浏览

android - 使用 diff utils 重置回收站视图装饰

我有一个使用 diff utils 更新的网格回收器视图,但如果列表数据中的某些内容导致项目从第一行下方的任何行到第一行,那么装饰缺少顶部填充,这是预期的因为如果它位于第一行,我只会在列表中的项目顶部添加填充。然后我为每个项目添加底部填充,

回收站视图装饰

如果我调用 notifyDatasetChanged,这将重新计算我的装饰并将填充添加到顶行,但是 diff utils 没有调用 notifyDatasetChanged(认为它调用了更改的项目范围、插入的项目、删除的项目的组合,以保持动画)所以我的装饰不会重新应用,我可能自己重新应用它,但这似乎是每次物品更改时都必须移除并重新应用装饰的黑客,有没有人知道更好的方法?

0 投票
2 回答
1139 浏览

android - java.lang.IndexOutOfBoundsException:检测到不一致。使用 DiffUtil 时视图支架适配器无效

下面是一个适配器类,用于在回收站视图中加载所有图书项目。使用 DiffUtils 以便不会通知整个列表。

我的 DiffUtil 课程如下。我已经扩展了 DiffUtil 类并检查了项目是否相同,如果不是,那么 DiffUtil 将处理更新

模型类

我的应用程序崩溃了,我收到了这个错误:

java.lang.IndexOutOfBoundsException:检测到不一致。无效的视图支架适配器位置BooksViewHolder

我已经实现了 DiffUtil 类,因此不会通知整个 recycleview 视图项。

参考:https ://developer.android.com/reference/kotlin/androidx/recyclerview/widget/DiffUtil

0 投票
3 回答
3870 浏览

android - Recyclerview DiffUtil 项目更新

我的 recyclerview 中有无尽的滚动,所以当有新数据时它会更新。我正在使用 DiffUtil 更新 recyclerview 中的数据。DiffUtil 确实会更新数据,但只要有更新数据,recyclerview 就会滚动到顶部,看起来就像“使用 notifydatasetchanged()”。这是我的 DiffUtil 和我的适配器来更新数据。

这是我更新数据的适配器

请帮我解决一下这个。当我使用 notifyItemRangeChanged() 时它工作正常......所以我应该使用什么来更新 recyclerview 中的数据以获得最佳实践。

https://drive.google.com/open?id=1SapXW2wusmTpyGCRA9fa0aSLCYNL1fzN

0 投票
1 回答
986 浏览

android - Android DiffUtil::onBindViewHolder 返回从列表中移除的位置

单击项目时,我试图从适配器中删除项目显示正在做正确的事情,但是当我单击最后一个项目时,出现IndexOutOfBound 异常

我的差异用途如下

这就是我更新列表的方式,其中 newList 从中删除了一个项目。

显示正在按预期删除具有默认值的项目

onBindViewHolder在dispatchUpdatesTo之后触发

val Item = itemList[position] itemList仍有更新前的大小。

当我单击最后一个项目将其删除时,

itemList[position]?.Id?.let { itemList[position]位置返回旧列表的最后一项,所以我得到了IndexOutOfBound 异常

我做错了什么 ?

0 投票
1 回答
87 浏览

android - LiveData、DiffUtil 和对象引用

LiveData一个用户列表:

然后更新:

DiffUtil没有看到不同,因为User是同一个对象,所以它只是在内部更新Adapter

一种解决方案是创建一个新实例或副本,然后DiffUtil会注意到差异。有更好的吗?

0 投票
0 回答
1887 浏览

android - RecyclerView / DiffUtils 动画当数据集更改而没有完全刷新

我想要两件事:

  • 当我删除 RecyclerView 中的项目时不重新加载/刷新适配器(不使用notifyDatasetChanged)。
  • 为此,我正在使用 DiffUtils,它工作得非常好。但我也想保留对DefaultItemAnimatorDiffUtilsRecyclerView显然没有影响的 。

所以我的问题是:如何在不刷新所有数据集的情况下删除/更新项目并保持与该项目类似的动画DefaultItemAnimator

我知道很多帖子都给出了答案,RecyclerView但没有一个符合我的需求。我知道notifyItemRemovednotifyItemRangeChanged但他们也刷新了所有数据集。

谢谢

编辑提供一些代码以便更好地理解:

在我的适配器中,我做了两种方法:这就是我在特定位置删除视图的方式。

这是我的 DiffUtils 课程:

这完美地从列表中删除了该项目,但没有动画。我RecyclerView的也有ItemAnimator

recyclerView.setItemAnimator(new DefaultItemAnimator());

在使用DiffUtils课程之前,我是这样删除的:

这也适用于动画,但刷新了所有其他项目。

0 投票
1 回答
716 浏览

java - Android RecyclerView DiffUtil.Callback: areContentsTheSame() 和 getChangePayload() 给出不同的比较结果

DiffUtil.Callback 中有 2 个函数需要覆盖:

我知道前者检查内容是否已更改,我想通过直接使用'=='来简单地比较它们是否是同一个实例,因为我相信我的项目在更新时将是一个新实例。但是相同的比较在后一个函数中给出了不同的结果。这是代码:

我不明白为什么旧项目和新项目之间的相同比较会给出不同的结果,是超类修改列表还是什么?

0 投票
1 回答
536 浏览

android - 如何正确编写 DiffUtil.Callback 以便 recyclerview 移动动画?

我有一个普通旧数据类型的 recyclerview 适配器,在我的例子中是 char。

适配器由列表支持。

setChar 方法更新列表。

假设在我的情况下,setChar 仅使用与适配器相同的列表调用,但仅使用移动的项目。

DiffUtil.Callback 的正确实现是什么,以便将动作正确地设置为 recyclerview 的动作?

目前,它的动画效果就好像该项目被移除并重新插入一样。