问题标签 [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 - 使用 diffutil 的回收器适配器,无法看到新添加的项目用户需要向下滚动
适配器类,具有 DiffUtil 实现
我将新列表/实时数据设置为适配器的活动中的 Oncreate() 方法
问题是我必须滚动才能看到添加到列表中的新项目。我如何确保新项目在不滚动的情况下可见,就像我们在 whatsapp 聊天中看到的那样。
java - 插入项目时 RecyclerView 行闪烁/闪烁
每当我将一个项目插入到我的 Room 数据库中时,我的回收站视图都会闪烁包含新插入的视图持有者的行(列表的其余部分不会闪烁)。我正在使用 LiveData 通过在观察到的 ViewModel 方法的 onChanged() 中调用 submitList(list) 来自动更新列表。我的适配器扩展了 ListAdapter,我正在使用 DiffUtil 来跟踪列表中的更改。话虽如此,我不会直接调用 notifyItemInserted(position) ,因为 DiffUtil 应该为我执行此操作。有 2 个实例会插入一个项目 (1) 一个全新的项目被插入到列表的末尾 (2) 一个已删除的项目被重新插入到列表中。在这两种情况下,项目都会自行插入然后闪烁。我读过很多帖子,人们建议在回收站视图上禁用动画,但这对我来说不是一个选择,因为我依赖代码中其他地方的动画。任何其他建议将不胜感激。我试图保持发布的代码简短,但如果有帮助,我可以发布更多内容。
MainActivity.java
RecyclerAdapterMain.java
ListItem.java (POJO)
kotlin - 如何从现有列表中搜索 diffutil 过滤掉结果
我在我的 RecyclerView 中使用 DiffUtil 来使用 Room 组件显示来自数据库的列表。我想在 Appbar 中添加一个搜索功能,它会在用户输入时过滤掉列表中的现有项目。
我的应用目前在操作栏中有一个搜索图标,当您单击搜索图标时,它将在整个应用栏展开并允许用户搜索数据库并返回一个新列表。此方法涉及每次查询数据库。
搜索菜单,这是设置搜索小部件参数的地方。
RecyclerViewFragment
我的 RecyclerViewAdapter
我想避免每次都查询数据库以获取搜索结果,我想使用 onQueryTextChange 以便它遍历现有列表并在用户输入查询时更新列表。
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)
android - DiffUtil 和 SortedList 哪个更高效?
我最近遇到了使用Diffutil和SortedList.Callback<>直接更改数据而不是notifyDataSetChanged()的概念,但现在我很困惑在哪种情况下使用哪个。
java - (android) 我可以在我的 DiffUtill 实现中使用此代码吗?
我现在正在制作一个DiffUtil
类来仅更新RecyclerView
.
我看过其他几个示例代码。
在比较两个对象的时候,他们比较的是唯一值,比如Model(Data)
类中定义的id areItemsTheSame()
。
但是,我认为很难将id
or分配unique value
给 List,或者代码很乱。
我必须id
像这样定义和比较吗?
我真的需要在Model class
分隔每个对象的 中定义一个唯一的 Id 变量吗?或者我不应该简单地使用equals()
?
使用 this 不只是比较对象的地址,还比较对象的内容?
作为一个附加问题
DiffUtil.CallBack
和 和有什么不一样DiffUtil.ItemCallBack
?
这是我的代码。
例程模型.java
RoutineDiffUtil.java
android - 如何禁用更新项目时发生的 RecyclerView (ListAdapter) 的自动滚动?
背景
我有一个 UI 显示用户全名列表,每个项目都有一个喜欢/不喜欢按钮。我正在使用ListAdapter
引擎盖下的用途DiffUtil
和AsyncListDiffer
API。用户列表作为 LiveData 从 Room 数据库接收,并按"isLiked" 排序。
问题
每当点击类似按钮时,我使用 LiveData 的 Room 都会将新数据重新提交给适配器。问题是,由于列表是按“isLiked”排序的,被喜欢的用户会改变它的位置,而 RecyclerView 总是会滚动到新的位置。
我不想看到更新项目的新位置。那么,如何禁用自动滚动行为?
我尝试了什么
MainActivity.kt
用户适配器.kt
我尝试使用常规的 RecyclerView 适配器和 DiffUtil,并将检测移动设置为 false。
我也添加了 AsyncListDiffer。
我尝试了ListAdapter,甚至尝试了分页库并使用了PagedListAdapter。
DiffUtil 的回调更改了自动滚动,但我无法获得所需的行为。
任何帮助是极大的赞赏!
android - DiffUtil 不应该与 hashCode 进行比较吗?
我现在正在开发锻炼日志应用程序。
两个项目 ( routine and routine detail
) 用 表示one recycler view and adapter
。
如果我单击添加例程按钮,则会添加一个例程项,并且例程基本上有一个例程详细项。
日常项目有按钮add or delete routine detail items
。
我曾经DiffUtil
更新项目。
在areItemsTheSame()
中,我曾经hashCode
比较oldList
和newList
。
但是,在添加或删除项目时会出现一个原因不明的问题。(不是错误)。
如果我在添加例程项目和详细项目后单击删除按钮,它首先运行良好。
除非按下上一个例程项的删除按钮,否则下一个例程项的例程详细按钮不能添加或删除。
如果上一个例程项目的删除按钮被按下,然后下一个项目的按钮被按下,则执行添加或删除。
为什么是这样?
当您使用hashCode comparison
.
但是,equals()
这不会发生并且工作正常。
相反,每次添加或删除项目时,整个项目都会闪烁更新。
我必须如何定义 DiffUtil 类?
代码
例程模型.java
例程适配器.java
RoutineDiffUtil.java
MainActivity.java
android - ListAdapter Diff 不会在同一个列表实例上分派更新,但也不会在与 LiveData 不同的列表上分派更新
如果新列表仅具有修改的项目但具有相同的实例,则 ListAdapter(实际上是其实现的 AsyncListDiffer)不会更新列表是一个已知问题。如果您在内部使用相同的对象,更新也不适用于新实例列表。
为了使所有这些工作,您必须创建整个列表和内部对象的硬拷贝。实现这一目标的最简单方法:
但我面临一个相当奇怪的问题。我的 ViewModel 中有一个解析函数,它最终将 items.toMutableList().map { it.copy() } 发布到 LiveData 并在片段中获取观察值。即使使用硬拷贝,DiffUtil 也不起作用。如果我将硬拷贝移动到片段内,那么它可以工作。
为了更容易,如果我这样做:
在视图模型中:
在片段中:
......然后,它不起作用。但如果我这样做:
在视图模型中:
在片段中:
...然后它的工作原理。
谁能解释为什么这不起作用?
同时,我在 Google 问题跟踪器上打开了一个问题,因为他们可能会修复 AsyncListDiffer 而不更新相同的实例列表或项目。它破坏了新适配器的目的。AsyncListDiffer应该始终接受相同的实例列表或项目,并使用用户在适配器中自定义的差异逻辑进行完全更新。
java - DiffUtil 未调用 onBindView 或刷新 ViewHolder
我尝试使用 DiffUtil 方法更新我的列表,该列表始终包含 30 个项目,现在每个项目数据每分钟更新一次,但无法判断所有项目的数据是否都会更新,以避免滥用notifyDataSetChanged()
我创建了一个扩展 DiffUtil 的类。
}
添加新的公共函数以通过此通知适配器
覆盖另一个 onBindViewHolder(不使用有效负载时不确定是否需要)
然后通过调用更新列表
列表的更新有效,但我只能通过滚动列表来查看这些新值,即使不回收视图(滚动时),我也需要查看更新,就像notifyItemChanged()
.
据我了解,调用dispatchUpdatesTo
应该处理和更新视图及其数据,或者我在这里遗漏了什么,请赐教。