问题标签 [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 回答
400 浏览

android - RecyclerView DiffUtil.dispatchUpdateTo 完成通知

我目前正在使用 DiffUtil 类来计算更新并将更新发送到我的适配器ListUpdateCallback,如下所示:

正如您从这段代码中看到的那样,我正在使用相关方法更新适配器,但我只想在插入某些内容时运行一些代码。但是,这确实有效,因为可以(并且)在插入代码之后调用其他通知方法,这会导致插入某些内容时我正在运行的代码出现一些问题。理想情况下,我需要知道所有更新何时已发送到适配器,以便我可以在需要时运行相关代码。有没有这样的方法或方法可以知道这一点?

我目前的解决方案是用来postDelayed执行这段代码,并希望适配器更新在它运行时已经完成。不漂亮,也不理想!

0 投票
1 回答
639 浏览

android - 使用 diff utils 更新回收器视图适配器,添加项目时无法正常工作

我正在使用 diff utils 更新我的回收器视图(来自视图模型的实时数据返回一个列表),我有一个项目装饰,它向列表中的最后一个元素添加了大量的填充,但是 diff utils 正确更新了回收器视图通过调用 notifyItemInserted 而不是 notifyDataSetChanged,装饰仅应用于添加的最后一个元素,因此如果我将一个项目添加到我的回收站视图并调用通知数据集更改适配器重建,我的所有项目最后都会有大量的填充所有项目和填充仅在最后一个元素上(这是我想要的),如果我两次添加相同的项目,它会在最后一次添加之前添加它,例如,如果我有一个 1、2、3 的列表并且我添加在现有的 3 之前添加了另外 3 个,所以 1、2、3b、3a,有没有办法对此进行更多控制?

物品装饰

差异工具

从回收站视图适配器更新

0 投票
0 回答
1300 浏览

android - DiffUtil 问题:新旧列表相同

上下文:
MainActivity启动、创建列表ItemObject并调用ListFragment. 当用户点击button(在 中MainActivity)时,它会修改列表,然后调用listFragment来更新它。

发现问题:
update功能上listFragmentnewListoldList都是一样的。

这是我的代码。

MainActivity

并且ListFragment

这是我的ItemObject课:

奇怪的是我从不修改里面的列表ListFragment。那么,当列表更新时,我的调试 println 怎么可能告诉我新旧列表是一样的呢?

0 投票
1 回答
205 浏览

android-recyclerview - 我可以使用类的 hashCode 函数来验证两者在 diffutils 回调中是否具有相同的 areContentsTheSame 值?

我正在尝试使用 DiffUtils 回调实现 RecyclerView ListAdapter,以仅更新/插入已更改的行而不是全部。要实现,我必须从 diff utils areItemsTheSameareContentsTheSame. 我可以检查areItemsTheSame使用从 db 获得的每个对象的 id。但是因为areContentsTheSame我不想编写 equals 函数并用.equals方法或类似方法匹配每个字段。我想知道我可以使用类中的默认 hashCode 函数吗?如果不能,我可以像这样覆盖 hashCode 函数吗?

0 投票
0 回答
2363 浏览

android - DiffUtil.Callback 未按预期工作

我正在使用 DiffUtil.ItemCallback 和 ListAdapter 来更新 RecyclerView。

它工作得很好,但它的行为让我感到困扰。

根据文档,只有在返回areContentsTheSame时才应调用该方法。areItemsTheSametrue

从文档中:

仅当 areItemsTheSame(int, int) 为这些项目返回 true 时才调用此方法。

但是,在我的情况下,当使用新列表更新列表时,如下所示:

DiffUtil.ItemCallback 确实触发了,但即使areItemsTheSame返回true它也不会立即调用areContentTheSame(如预期的那样?),而是areItemsTheSame在不同的对象对上一次又一次地调用,(我在那里使用了带有断点的调试器)。在areItemsTheSame调用了几次并返回 true 后,它终于调用了areContentTheSame,有时,我看到传递给的对象areContentTheSame实际上不一样!并且有不同的id!!这意味着areContentTheSame甚至不应该调用这些对!

这就是我的 DiffUtilCallback 的实现方式:

此外,在运行此程序时,在 logcat 中我看到很多调用areItemsTheSamewithtrue但很少areContentTheSame

这是预期的行为吗?

0 投票
1 回答
765 浏览

java - 如何修复使用 DiffUtil 向 ListUpdateCallback 发送更新时得到的错误位置

我有一个Android应用程序,用户可以同时修改多个String项目EditText,所以我需要弄清楚发生了什么变化以便通知服务器有关更改(创建新项目、更新现有项目或删除后者),这就是为什么我使用DiffUtilwithListUpdateCallback来做到这一点。如果旧列表的大小为 2 项的问题;我删除了索引 0 处的项目,然后在列表末尾添加了 3 个项目,我得到一个回调,onInserted位置参数不正确,导致IndexOutOfBoundsException, (这是删除旧列表中任何项目的行为,除了最后一个)请看一下这个显示问题的 GIF

我已经尝试了以下代码,并对新列表进行了其他更改,例如在索引 1 处删除,然后在列表末尾添加 3 个项目,它工作正常!

我正在使用的数组是 Answer 类型,它是一个类:

请注意,如果两个项目相同,则 id 可以识别 2 个不同的对象;然后可以通过文本识别内容。

DiffUtil.Callback

在 ListUpdateCallback 中,我试图记录我得到的回调,以便在我与服务器交谈之前测试它是否正常工作。

这是我得到的异常的logcat:

问题出在这一行:

为什么位置不是1?

如果我有 2 个项目的旧列表并且我删除了索引 1 处的项目然后将 3 个项目添加到列表的末尾,这里的更新 1是 logcat:

0 投票
0 回答
633 浏览

android - 嵌套 RecyclerView + ItemDecorator + DiffUtil 的问题

我在使用 DiffResult 刷新嵌套的 recyclerview 时遇到问题。我有一个父母名单,每个父母都有孩子名单。当我想刷新整个列表时,我计算父母列表的 DiffResult 和每个父母的孩子的 DiffResult。

当然,我将结果分派给每个适配器、绑定项目等。但是为每个子视图呈现正确的状态存在问题。

例如:第 1 步(未突出显示):

屏幕上的结果:

没关系。

第 2 步(仅突出显示第一个孩子):

屏幕上的结果(仅突出显示第一个子视图):

没关系。但第 3 步(均突出显示):

屏幕上的结果(BUG:仅突出显示第二个孩子!):

RecyclerView“重置”所有视图并仅为第二个孩子呈现“突出显示”视图。

但是:我可以避免这种行为,并在我设置parentRecyclerView.setItemAnimator(null)childRecyclerView.setItemAnimator(null).

怎么了?

0 投票
1 回答
149 浏览

android - 在 recyclerview 中更新 10 到 15 个项目时,Diffutils 会阻止 UI

这就是我进行计算和更新列表的方式。但是当我更新 2,3 个项目时,它完美无缺。但是当我更新像 20 这样的项目时,它会阻塞 UI 大约 10 秒。

0 投票
1 回答
3450 浏览

android - DiffUtil 没有更新 RecyclerView

我为 recyclerView 制作了一个适配器,并使用 DiffUtil 以更漂亮的方式显示列表的更新。我使用 google codelabs 作为参考。但该列表并未从以下代码更新。请帮忙

我的 MainActivity 文件是

我尝试了以前的 stackOverflow 答案,但没有一个有效。请帮忙

0 投票
1 回答
564 浏览

android - 未使用 DiffUtil 调用 getItemCount 或 onBindViewHolder

当用户到达滚动末尾以获得分页效果时,我正在更新我的列表。

这是我获取数据的地方

在适配器中,我使用 DiffUtil 设置新数据

ProductDiffCallback

当我调试时,我得到了新列表包含所有项目但没有触发适配器类