问题标签 [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.
android - 使用 DiffUtils ImageViews 更新 RecycleView 时闪烁
在我的 RecyclewView 的适配器中,我使用 DiffUtils 仅更新那些被修改的项目。在执行此操作时,我注意到 ImageViews 在每次更新时都会闪烁,并且在调试时我发现 onCreateViewHolder
每次更新数据时都会调用适配器的方法,因此不会像应有的那样重用视图持有者。当我摆脱 DiffUtil 并使用简单的notifyDataSetChanged
闪烁消失时。那么为什么要重新创建那些 ViewHolders,我该如何解决呢?
这是我的 DiffUtil 回调:
}
以及我如何更新我的适配器:
编辑:
我进一步研究了这个问题,并注意到在使用时也重新创建了视图notifyDataSetChanged
,我一直认为在更新期间视图被重用,但我想情况并非如此。无论如何,只有在使用 DiffUtil 而不是时,图像闪烁仍然可见notifyDataSetChanged
,我不知道为什么
android - 意外的 RecyclerView 滚动
加载新数据时,我的回收器视图会自动滚动一点,我已经尝试了许多解决方案但没有任何帮助,分页是使用 diffutil 设置的。设置seHasFixedSize
为 true 也不起作用视频可能会使问题变得清晰。
https://photos.app.goo.gl/SSiyxGWkeqvaHRPj6
这是我的适配器代码,它也是一个多视图适配器。
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
这是视图模型
android - AsyncListDiffer 没有更新 recyclerview
我有一个 RecyclerView 和一个使用AssyncListDiffer的适配器。我遇到的问题是,当 LiveData 发生更改时,recyclerview没有更新。观察者收到通知,但列表没有更新。
这是我的适配器:
我使用“ submitList() ”提交新列表。但它不起作用。
我在网上寻找解决方案,基本上有两种选择:
在submitList函数中,调用 AssyncListDiffer 的“submitList”两次,如下所示:
/li>- 第二个选项是使用ListAdapter并像这样覆盖“submitList”函数:
第一个解决方案有效,但每当我更新它时,recyclerview 就会闪烁。覆盖该方法的第二种解决方案对我不起作用。
几天来我一直在尝试解决这个问题,但我无法让它工作。另外,我不想使用 notifyItemChanged() 或 notifyDataSetChanged()。
还有其他方法吗?
android - 如何将 DiffUtil 与多种视图类型一起使用
我已经实现了具有多种视图类型的 recyclerview,并且我想添加 DiffUtil。我设法为一种类型做到了,但是当我尝试支持多种视图类型时,我不能
所以我的问题是:DiffUtil 是否支持多种视图类型,是否有一个很好的 java 实现教程
我的适配器
android - 无法使用 Diff Util 更新特定值
我有一个应用程序来显示项目列表。每当价格发生变化时,我只需要更新商品的价格文本视图。但整个列表正在回收站视图中更新。
我正在使用这个库中的 DiffUtil在下面的示例中,当updateItems()
被调用时,我只需要将GRAPES Item
Price Textview 更新为最新价格。
请指导我......
代码
分段
模型
android - 从其他适配器更新 recyclerview 适配器
我想要什么- 我有分类 recyclerview 和 quoteList recyclerview。当用户单击任何类别时,它应该显示/动画该类别的报价。
问题- 1. 现在我尝试从类别适配器设置列表到我的报价适配器,但它给了我空指针执行。2. 我已经实现了 DiffUtils 但同样它不会更新数据而是返回空指针。
问题- 如何从 OnBindViewHolder 类别更新报价 Recyclerview ?
这是代码...
类别适配器
新的 MainActivity().setQupteAdapter(quoteList);
在上面的代码中,我尝试将适配器公开并用于更新适配器。但不工作,同样我尝试使用方法设置。:(不工作..
报价适配器
帮我找到更新报价单recyclerview的方法。
android - 如何使用 DiffUtil 保存对旧列表的引用
我像这样创建了我的 DiffUtil:
我想继续引用我的 oldList,所以我可以“重新启动”我更新的列表。
我试图这样做:
而不是在构造函数中初始化:
但我只是得到一个空列表。
我该如何解决这个问题?
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 没有带有测试对象的实例
android - RecyclerView 未使用 submitList() 和 LiveData 自动刷新
情况如下:
我有RecyclerView
一个Fragment
using 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 中看到数据正在正确更新。
提前致谢