问题标签 [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 投票
1 回答
454 浏览

android - 使用 DiffUtils ImageViews 更新 RecycleView 时闪烁

在我的 RecyclewView 的适配器中,我使用 DiffUtils 仅更新那些被修改的项目。在执行此操作时,我注意到 ImageViews 在每次更新时都会闪烁,并且在调试时我发现 onCreateViewHolder每次更新数据时都会调用适配器的方法,因此不会像应有的那样重用视图持有者。当我摆脱 DiffUtil 并使用简单的notifyDataSetChanged闪烁消失时。那么为什么要重新创建那些 ViewHolders,我该如何解决呢?

这是我的 DiffUtil 回调:

}

以及我如何更新我的适配器:

编辑: 我进一步研究了这个问题,并注意到在使用时也重新创​​建了视图notifyDataSetChanged,我一直认为在更新期间视图被重用,但我想情况并非如此。无论如何,只有在使用 DiffUtil 而不是时,图像闪烁仍然可见notifyDataSetChanged,我不知道为什么

0 投票
0 回答
147 浏览

android - 意外的 RecyclerView 滚动

加载新数据时,我的回收器视图会自动滚动一点,我已经尝试了许多解决方案但没有任何帮助,分页是使用 diffutil 设置的。设置seHasFixedSize为 true 也不起作用视频可能会使问题变得清晰。 https://photos.app.goo.gl/SSiyxGWkeqvaHRPj6

这是我的适配器代码,它也是一个多视图适配器。

0 投票
0 回答
218 浏览

android - 选中复选框时,它会更新 recyclerview 中的其他行。用于更新和绑定数据的 DiffUtils 和 DataBinding

我正在尝试实现一个任务创建应用程序。用户应该能够检查任务以将其标记为已完成。但是,当在 recyclerview 中按下多个视图的复选框时,它会开始更新其他行。假设我有 3 行 - A,B,C ,我选中 A 的复选框,当我选中 B 的复选框时,奇怪的事情开始发生,A 的行标题更改为,现在我有 2 个项目的标题为 B。当我取消选中 B 时,它也会取消选中 A。所以这是我的代码。当我在 equals 方法中删除 Object.equals(completed, task.completed) 检查时,这种混乱就停止了。但在这种情况下,不会调用 setStyle 函数,它负责在 textview 上绘制笔画。

公共类 TasksAdapter 扩展 ListAdapter {

}

这是 XML

这是视图模型

0 投票
2 回答
4646 浏览

android - AsyncListDiffer 没有更新 recyclerview

我有一个 RecyclerView 和一个使用AssyncListDiffer的适配器。我遇到的问题是,当 LiveData 发生更改时,recyclerview没有更新。观察者收到通知,但列表没有更新。

这是我的适配器:

我使用“ submitList() ”提交新列表。但它不起作用

我在网上寻找解决方案,基本上有两种选择:

  1. submitList函数中,调用 AssyncListDiffer 的“submitList”两次,如下所示:

    /li>
  2. 第二个选项是使用ListAdapter并像这样覆盖“submitList”函数:

第一个解决方案有效,但每当我更新它时,recyclerview 就会闪烁。覆盖该方法的第二种解决方案对我不起作用。

几天来我一直在尝试解决这个问题,但我无法让它工作。另外,我不想使用 notifyItemChanged() 或 notifyDataSetChanged()。

还有其他方法吗?

0 投票
1 回答
1905 浏览

android - 如何将 DiffUtil 与多种视图类型一起使用

我已经实现了具有多种视图类型的 recyclerview,并且我想添加 DiffUtil。我设法为一种类型做到了,但是当我尝试支持多种视图类型时,我不能

所以我的问题是:DiffUtil 是否支持多种视图类型,是否有一个很好的 java 实现教程

我的适配器

0 投票
0 回答
95 浏览

android - 无法使用 Diff Util 更新特定值

我有一个应用程序来显示项目列表。每当价格发生变化时,我只需要更新商品的价格文本视图。但整个列表正在回收站视图中更新。

我正在使用这个中的 DiffUtil在下面的示例中,当updateItems()被调用时,我只需要将GRAPES ItemPrice Textview 更新为最新价格。

请指导我......

代码

分段

模型

0 投票
2 回答
62 浏览

android - 从其他适配器更新 recyclerview 适配器

我想要什么- 我有分类 recyclerview 和 quoteList recyclerview。当用户单击任何类别时,它应该显示/动画该类别的报价。

问题- 1. 现在我尝试从类别适配器设置列表到我的报价适配器,但它给了我空指针执行。2. 我已经实现了 DiffUtils 但同样它不会更新数据而是返回空指针。

问题- 如何从 OnBindViewHolder 类别更新报价 Recyclerview ?

这是代码...

类别适配器

新的 MainActivity().setQupteAdapter(quoteList);

在上面的代码中,我尝试将适配器公开并用于更新适配器。但不工作,同样我尝试使用方法设置。:(不工作..

报价适配器

帮我找到更新报价单recyclerview的方法。

0 投票
0 回答
28 浏览

android - 如何使用 DiffUtil 保存对旧列表的引用

我像这样创建了我的 DiffUtil:

我想继续引用我的 oldList,所以我可以“重新启动”我更新的列表。

我试图这样做:

而不是在构造函数中初始化:

但我只是得到一个空列表。

我该如何解决这个问题?

0 投票
0 回答
132 浏览

android - 为什么使用 Kotlin 密封类时 DiffUtil 不抛出 ClassCastException

我正在使用带有 Android 列表适配器的密封类,其中 2 个不同的对象合并到一个列表中。列表中的最后一项只是添加更多布局(如页眉)。我正在使用 DiffUtils 并注意到即使我将 newItem 转换为 Object1 它也不会引发任何类转换异常。例如:第一个在 Adaptor 的 currentList 中有 7 个项目(6 个 Object1 + 1 Add More)然后我删除了 1 个对象,让它成为索引为 6 的对象。现在当 diffUtil 检查 areItemsSame() 时,它不会抛出异常. 根据我的想法,6 处的 oldItem 将是 Object1,因为该项目已被删除,这意味着现在 6 索引处的项目是 Add More,现在将其转换为 Object1 应该抛出 ClassCastException

我的差异实用程序代码

这是添加测试之前的日志

添加测试后的日志

删除测试后的日志

如您所见,删除后 Log 甚至没有记录 oldList 的测试对象,这意味着 oldList 没有带有测试对象的实例

0 投票
1 回答
1853 浏览

android - RecyclerView 未使用 submitList() 和 LiveData 自动刷新

情况如下:

我有RecyclerView一个Fragmentusing DataBinding。它的适配器是一个ListAdapter.

要显示的数据由 表示List<Double>。设置后,列表用于初始化 a MutableLiveData,如下所示:

注意:该update()方法会更改列表的值,例如:data[0] = someValue. 它不使用clear()也不addAll()更新它。

  • 另外,ListAdapter.onCurrentListChanged()为了把println()里面放进去覆盖。

在这一点上,没有什么特别的。创建片段时,会RecyclerView显示初始列表。在 Logcat 中:

现在,当我单击按钮时,UI 不会刷新,因为我没有分配新列表,而只是更新当前列表。此外,如果我导航到另一个片段然后返回,RecyclerView 则会显示更新的值。

所以我在末尾添加以下内容onButtonClicked()

但这不起作用,单击按钮后 UI 仍未自动更新。此外,Logcat 只打印 'before submit' 和 'after submit',具有相同的ListAdapter.currentList值:

对我来说,打印应该看起来像这样:

似乎ListAdapter.currentList甚至在调用之前就已经有了更新的值submitList()。我想这就是为什么RecyclerView不刷新的原因,因为提交的列表与当前列表相同。
最后我还尝试了以下操作,但onButtonClicked()没有成功:

和这个...

...给了我:

现在onCurrentListChanged()被调用,但在 2 个打印的末尾而不是在中间。
此外,ListAdapter.currentList似乎在“提交后”打印中包含值,但在onCurrentListChanged()打印中实际上是空的。令人困惑...

我发现进行RecyclerView刷新的唯一方法是调用notifyDataSetChanged(). 但是,使用ListAdapter及其submitList()方法没有任何好处。

作为一个新手,我可能做了一些不正确的事情,但我不知道是什么。
问题仅在于 UI 不刷新。我可以在 Locgcat 中看到数据正在正确更新。

提前致谢

编辑