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

android - 在后台线程上使用 DiffUtil 滚动时,Recyclerview 仍然冻结/滞后

我有一个包含 20-60 件物品的回收站视图。我正在使用 Room+Livedata 和 Diffutil。Recyclerview 一般每秒更新 2-3 次。项目不会只改变项目的内容被修改,例如当前下载项目的百分比变化。我在后台线程中使用 diffutil 。我在 diffutil 工作时忽略了任何更新,只保留和处理最新的更新。我没有使用任何 ItemAnimator,而是通过有效负载仅更改 onbindView 上的百分比。

很快,我已经使用了我发现的所有可能的解决方案来使 RecyclerView 更流畅、更快。

但是,如果项目在滚动时更新,滚动仍然会冻结 UI 0.2 秒。当该项目当时对用户不可见时,甚至会发生这种情况。

您有什么建议还是我应该接受这种滞后并继续?

0 投票
1 回答
18 浏览

android - ListAdapter 未填充应用程序第二个片段上的适配器

我有一个包含 2 个片段的应用程序,它们都有从同一个适配器填充的列表。

第一个工作正常,但第二个 -

根本不填充适配器。它只是不显示任何列表。

肯定缺少某些东西,因为我能够在第一个片段中正确填充我的适配器,但是来到这个片段时,列表不会弹出。

这是我的 ListAdapter 实现 -

和我的 ViewHolder 和模型 -

我错过了什么?刚从普通的 RecyclerView.Adapter 开始使用 ListAdapter。

0 投票
1 回答
826 浏览

android - Android - ViewPager2 在调用 Diffutil.dispatchUpdatesTo 时将适配器位置重置为 0

我有一个 ViewPager2 设置为水平滑动。我的想法是构建一个无限滚动寻呼机。该类看起来像这样:

class SwipeAdapter(fragmentActivity: FragmentActivity): FragmentStateAdapter(fragmentActivity)

我已经覆盖了createFragment(position: Int): Fragment我返回新片段的通常情况


我有一个我正在操作的 Id 列表,它是适配器数据集。

private var contentIds = mutableListOf<Int>()

我也实施了


我的 DiffUtil 看起来像这样:

因为我只处理 ID,所以这里没有什么特别的事情发生。

我如何设置数据?


所以逻辑是,我已经注册了一个registerOnPageChangeCallback并覆盖了方法 onPageSelected

在那里,我检查用户刷了多少页,当用户刷了 60% 的项目时(val sixtyPercentItems: Int = ceil(viewpager2Adapter.itemCount - 1 * 0.6).toInt()),我调用我的 API 来获取下一组项目。当该 APi 返回时,我调用adapter.setData(如上所示的方法)。


令人惊讶的是,当这种情况发生时,我的适配器重置为零!我的列表没有重置,即它正在添加项目,我没有保留任何会影响此行为的特殊变量。我有点在修复中。这就是 DiffUtil 的重点,对吧?有人遇到过这个吗?

0 投票
2 回答
296 浏览

android - 在第一个 viewType 上收到 DiffUtil 有效负载数据,但我需要第二个 Viewtype

我在带有 DiffUtil 的 RecyclerView 适配器自定义类中使用了两个 viewType。

在那我更新数据它将更新 Diffutil getChangePayload但它会更新第一个视图类型。

如何将有效负载数据更改为TYPE_ITEM viewType?

0 投票
0 回答
128 浏览

java - Java Kotlin Generic 将类 getter 作为函数中的参数传递

我正在做一些关于 android DiffUtil 的事情,我想让它成为通用的。我想在创建类 A 时传递 getter 函数(itemGetter),但是当我在构造函数中声明 itemGetter 的类型时。我不知道如何声明它。()->V 不正确。因为我不能做像 item.itemGetter() 这样的事情 Class T 是关于一个带有 itemGetter 的类

谢谢

更新具体示例

因为我们检查了 itemsTheSame 需要比较模型 T 中的名称或 ID 或某些实例,因此,我需要将模型 T 中的 getter 作为函数传递给 DiffCallBackUtil。因此,我可以调用oldList[oldi].getName()===newList[newi].getName()

0 投票
1 回答
576 浏览

android - 由于 ItemTouchHelper 和 DiffUtil 之间的冲突,不需要的动画

我正在实现一个支持拖放的 RecyclerView。当删除一个项目时,该项目的索引列将在 Room 数据库中更新,以存储更新后的排序。

我面临的问题是,当我在删除项目后调用Room数据库更新时,因为项目列表是ViewModel中的LiveData并通过Databinding绑定到RecyclerView,DiffUtil会立即重新计算项目位置和内容,其中1 . 添加新的不需要的动画和 2. 有时内容没有正确刷新。

ItemTouchHelper:

MyAdapter 中的 DiffUtil:

我想更改它以便 DiffUtil 不会干扰 ItemTouchHelper,但我仍然希望在插入新注释时保留 DiffUtil 以获得漂亮的动画。将不胜感激的建议。

0 投票
1 回答
39 浏览

android - Recyclerview 数据在未指定的情况下被更改

我正在我的模型列表中执行一些操作,然后传递给回收器适配器并更新适配器列表。由于某些意外原因,适配器列表在我通过新列表之前已更新。我正在使用 DiffUtil 来计算 oldList 和 newList 之间的差异。

这是我在适配器中的submitList()函数:

在最后一种方法中,我使用submitList()更新适配器列表,当我检查viewModel.todayPayments = todayPayments行中的适配器列表时,它已经使用之前的操作“forEachIndexed()”进行了更新,因此 DiffUtil 没有t 工作正常,因为它找不到oldListnewList之间的区别。

0 投票
1 回答
368 浏览

android - android ListAdapter 使用 MVVM 选择状态

我找不到使用 MVVM 架构在 ListAdapter 中选择状态的好方法。我还在使用@Doug Stevenson 为 Firestore 实现的存储库 LiveData

我试图避免notifyDataSetChanged(),因为在 UI 上造成明显的故障

在几天的尝试中,这是我最后一次尝试,因为oldList它被保存为参考,所以DiffUtil.ItemCallback没有检测到任何变化。似乎我需要对列表进行深度克隆,但我认为必须有更好的性能解决方案。

主视图模型

主要片段

RepositoryCommon

对于选定的状态,我添加了一个sel对象,但由于我不想将其添加到数据库中,所以我添加到了包装器接口

主适配器

QueryItemDiffCallback

0 投票
1 回答
267 浏览

android - DiffUtil 浓缩咖啡测试

[测试] 如何为 DiffUtil 编写测试用例?

我们如何编写一个特定的测试用例,我们onBindViewHolder没有被新列表中的项目调用,这些项目相对于旧列表没有修改,这基本上是DiffUtil为了让一切顺利?

关于我们如何监听回收器视图本身的更改的任何想法?

我正在考虑使用registerAdapterDataObserver(AdapterDataObserver),我们可以在其中覆盖onItemRangeChanged并听取更改,但是在测试中使用这种方法并不好。

0 投票
1 回答
1052 浏览

android - 将 RecyclerView 与 DiffUtil 一起用于多种数据类型

如果适配器接收单一数据类型对象,我知道如何实现 DiffUtil。

但就我而言,我有一个适配器,它从一个片段中获取两种数据类型。

那么如何将 DiffUtil 与多种数据类型一起使用呢?

这是我的适配器代码:

}

注意:我有两种类型的数据:

1- CurrentVisitorResponseItem

2- LeavedVisitorResponseItem