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

android - 使用 diffutil 的回收器适配器,无法看到新添加的项目用户需要向下滚动

适配器类,具有 DiffUtil 实现

我将新列表/实时数据设置为适配器的活动中的 Oncreate() 方法

问题是我必须滚动才能看到添加到列表中的新项目。我如何确保新项目在不滚动的情况下可见,就像我们在 whatsapp 聊天中看到的那样。

0 投票
1 回答
703 浏览

java - 插入项目时 RecyclerView 行闪烁/闪烁

每当我将一个项目插入到我的 Room 数据库中时,我的回收站视图都会闪烁包含新插入的视图持有者的行(列表的其余部分不会闪烁)。我正在使用 LiveData 通过在观察到的 ViewModel 方法的 onChanged() 中调用 submitList(list) 来自动更新列表。我的适配器扩展了 ListAdapter,我正在使用 DiffUtil 来跟踪列表中的更改。话虽如此,我不会直接调用 notifyItemInserted(position) ,因为 DiffUtil 应该为我执行此操作。有 2 个实例会插入一个项目 (1) 一个全新的项目被插入到列表的末尾 (2) 一个已删除的项目被重新插入到列表中。在这两种情况下,项目都会自行插入然后闪烁。我读过很多帖子,人们建议在回收站视图上禁用动画,但这对我来说不是一个选择,因为我依赖代码中其他地方的动画。任何其他建议将不胜感激。我试图保持发布的代码简短,但如果有帮助,我可以发布更多内容。

MainActivity.java

RecyclerAdapterMain.java

ListItem.java (POJO)

0 投票
1 回答
277 浏览

kotlin - 如何从现有列表中搜索 diffutil 过滤掉结果

我在我的 RecyclerView 中使用 DiffUtil 来使用 Room 组件显示来自数据库的列表。我想在 Appbar 中添加一个搜索功能,它会在用户输入时过滤掉列表中的现有项目。

我的应用目前在操作栏中有一个搜索图标,当您单击搜索图标时,它将在整个应用栏展开并允许用户搜索数据库并返回一个新列表。此方法涉及每次查询数据库。

搜索菜单,这是设置搜索小部件参数的地方。

RecyclerViewFragment

我的 RecyclerViewAdapter

我想避免每次都查询数据库以获取搜索结果,我想使用 onQueryTextChange 以便它遍历现有列表并在用户输入查询时更新列表。

0 投票
0 回答
351 浏览

java - 为什么在 RecyclerView 中重复拖动动画?

我正在使用 ItemTouchHelper 类来支持在我的 RecyclerView 中拖放。当我在它周围拖动一个项目时,它会按预期在视觉上更新(交换行)。一旦我放下该项目,就会发生另一个**视觉**拖动。例如(见下图)如果我将项目“a”从索引 0 拖到索引 3,正确的列表显示项目“b”现在位于索引 0。他们的回收器视图重复操作并在索引 0 处获取新项目("b") 并将其拖到索引 3!无论我从哪个索引拖动或拖动到哪个索引,都会发生这种重复的拖动。

我称它为**视觉**拖动,因为我提交给我的 RecyclerView 的 ListAdapter 的列表是正确排序的(由日志验证)。如果我重新启动我的应用程序,列表的顺序正确。或者,如果我调用 notifyDataSetChanged(),在不需要的动画之后,它会正确排序。什么可能导致第二个动画?

编辑:根据文档,如果您在 areContentsTheSame() 方法 (DiffUtil) 中使用 equals() 方法,“此处错误返回 false 将导致动画过多。” 据我所知,我在下面的 POJO 文件中正确地覆盖了这个方法。我被难住了……

列表意外重新排序

二次拖动操作

MainActivity.java

RecyclerAdapterMain.java

ListItem.java (POJO)

0 投票
1 回答
371 浏览

android - DiffUtil 和 SortedList 哪个更高效?

我最近遇到了使用DiffutilSortedList.Callback<>直接更改数据而不是notifyDataSetChanged()的概念,但现在我很困惑在哪种情况下使用哪个。

0 投票
2 回答
145 浏览

java - (android) 我可以在我的 DiffUtill 实现中使用此代码吗?

我现在正在制作一个DiffUtil类来仅更新RecyclerView.

我看过其他几个示例代码。

在比较两个对象的时候,他们比较的是唯一值,比如Model(Data)类中定义的id areItemsTheSame()

但是,我认为很难将idor分配unique value给 List,或者代码很乱。

我必须id像这样定义和比较吗?

我真的需要在Model class分隔每个对象的 中定义一个唯一的 Id 变量吗?或者我不应该简单地使用equals()?

使用 this 不只是比较对象的地址,还比较对象的内容?

作为一个附加问题

DiffUtil.CallBack和 和有什么不一样DiffUtil.ItemCallBack

这是我的代码。

例程模型.java

RoutineDiffUtil.java

0 投票
1 回答
524 浏览

android - 如何禁用更新项目时发生的 RecyclerView (ListAdapter) 的自动滚动?

背景

我有一个 UI 显示用户全名列表,每个项目都有一个喜欢/不喜欢按钮。我正在使用ListAdapter引擎盖下的用途DiffUtilAsyncListDifferAPI。用户列表作为 LiveData 从 Room 数据库接收,并按"isLiked" 排序

问题

每当点击类似按钮时,我使用 LiveData 的 Room 都会将新数据重新提交给适配器。问题是,由于列表是按“isLiked”排序的,被喜欢的用户会改变它的位置,而 RecyclerView 总是会滚动到新的位置。

我不想看到更新项目的新位置。那么,如何禁用自动滚动行为?

我尝试了什么

MainActivity.kt

用户适配器.kt

我尝试使用常规的 RecyclerView 适配器和 DiffUtil,并将检测移动设置为 false。
我也添加了 AsyncListDiffer。
我尝试了ListAdapter,甚至尝试了分页库并使用了PagedListAdapter。
DiffUtil 的回调更改了自动滚动,但我无法获得所需的行为。

任何帮助是极大的赞赏!

0 投票
0 回答
246 浏览

android - DiffUtil 不应该与 hashCode 进行比较吗?

在此处输入图像描述

在此处输入图像描述

我现在正在开发锻炼日志应用程序。

两个项目 ( routine and routine detail) 用 表示one recycler view and adapter

如果我单击添加例程按钮,则会添加一个例程项,并且例程基本上有一个例程详细项。

日常项目有按钮add or delete routine detail items

我曾经DiffUtil更新项目。

areItemsTheSame()中,我曾经hashCode比较oldListnewList

但是,在添加或删除项目时会出现一个原因不明的问题。(不是错误)。

如果我在添加例程项目和详细项目后单击删除按钮,它首先运行良好。

除非按下上一个例程项的删除按钮,否则下一个例程项的例程详细按钮不能添加或删除。

如果上一个例程项目的删除按钮被按下,然后下一个项目的按钮被按下,则执行添加或删除。

为什么是这样?

当您使用hashCode comparison.

但是,equals()这不会发生并且工作正常。

相反,每次添加或删除项目时,整个项目都会闪烁更新。

我必须如何定义 DiffUtil 类?

代码

例程模型.java

例程适配器.java

RoutineDiffUtil.java

MainActivity.java

0 投票
2 回答
425 浏览

android - ListAdapter Diff 不会在同一个列表实例上分派更新,但也不会在与 LiveData 不同的列表上分派更新

如果新列表仅具有修改的项目但具有相同的实例,则 ListAdapter(实际上是其实现的 AsyncListDiffer)不会更新列表是一个已知问题。如果您在内部使用相同的对象,更新也不适用于新实例列表。

为了使所有这些工作,您必须创建整个列表和内部对象的硬拷贝。实现这一目标的最简单方法:

但我面临一个相当奇怪的问题。我的 ViewModel 中有一个解析函数,它最终将 items.toMutableList().map { it.copy() } 发布到 LiveData 并在片段中获取观察值。即使使用硬拷贝,DiffUtil 也不起作用。如果我将硬拷贝移动到片段内,那么它可以工作。

为了更容易,如果我这样做:

在视图模型中:

在片段中:

......然后,它不起作用。但如果我这样做:

在视图模型中:

在片段中:

...然后它的工作原理。

谁能解释为什么这不起作用?

同时,我在 Google 问题跟踪器上打开了一个问题,因为他们可能会修复 AsyncListDiffer 而不更新相同的实例列表或项目。它破坏了新适配器的目的。AsyncListDiffer应该始终接受相同的实例列表或项目,并使用用户在适配器中自定义的差异逻辑进行完全更新。

0 投票
1 回答
528 浏览

java - DiffUtil 未调用 onBindView 或刷新 ViewHolder

我尝试使用 DiffUtil 方法更新我的列表,该列表始终包含 30 个项目,现在每个项目数据每分钟更新一次,但无法判断所有项目的数据是否都会更新,以避免滥用notifyDataSetChanged()我创建了一个扩展 DiffUtil 的类。

}

添加新的公共函数以通过此通知适配器

覆盖另一个 onBindViewHolder(不使用有效负载时不确定是否需要)

然后通过调用更新列表

列表的更新有效,但我只能通过滚动列表来查看这些新值,即使不回收视图(滚动时),我也需要查看更新,就像notifyItemChanged().

据我了解,调用dispatchUpdatesTo应该处理和更新视图及其数据,或者我在这里遗漏了什么,请赐教。