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

android - 查看更改不正确

好的,从一开始,我有一个 RecyclerView,我想在其中更改条目的颜色,如果它们被点击的话。

如果选择了 View,Recyclerview 从数据库中获取一个列表,我在其中添加了一个 bool 值。

在我的持有人中,我检查是否选择了视图并使用选择器更改颜色。

到目前为止一切顺利,但现在出现了问题。

活动开始时,旧的选定条目是彩色的,但是当我单击另一个条目时,旧条目的颜色会消失,并且点击的条目没有任何反应。我必须再次重新单击旧条目,从这一点开始,颜色更改工作正常。

viewHolder 中调用的方法

选择器

来自应该改变颜色的视图的RelativeLayout

在 onCreate 中设置的 Activity 中的变量

onClick 方法

diffutil

ProductViewModel 是 MainActivity 中的一个lateinit

在 OnCreate 我设置了 ViewModel

通用适配器调用

表道

ProductRepro

产品视图模型

MainActivity 中的观察者

在 GenericAdapter 中设置项目

我记录了我的 Diffutil,每次单击不同的项目时,日志总是正确的。我记录了选定的表变量,它总是正确的。

我不知道从这一点开始。它只发生在活动开始时,然后它工作正常。你有什么提示或什么,我可以试试。如果您需要更深入地了解代码,请告诉我,我会发布更多信息。

0 投票
2 回答
372 浏览

firebase - Firebase 实时数据库、ListAdapter、DiffUtil 和 ViewModel

我正在尝试使用Recycler View并显示列表来创建列表视图。可以说我要显示的内容就像一个典型的聊天屏幕 - 图像、消息、sender_name 等。

所以所有这些数据都存储在 Firebase 实时数据库中。我也在使用ViewModel并且想使用DiffUtil以提高效率 - 因为可以删除、编辑、加星标、添加新消息等。由于DiffUtil,我使用的是ListAdapter.

我面临的问题是ListAdapter需要 aList并且我使用ChildEventListener.

我现在如何使用 Firebase 观察更改LiveData,然后更新我的列表,以便我可以传回我的DiffUtil? 因此,如果我添加一条新消息,我希望将其添加到我的消息中,RecyclerView并且我希望使用它来执行此操作,DiffUtil因为列表也可以更新。

我通过研究发现,我可能需要Room为此目的使用并观察查询的变化 - 所以观察类似于getAllMessages()返回完整列表的方法,然后我可以使用它传递到我的DiffUtil. 这对我来说听起来有点矫枉过正—— Room.

关于如何实现我的需求的任何指示或建议?

这是我的数据库的结构: 在此处输入图像描述

0 投票
1 回答
1509 浏览

android - 迁移到 ListAdapter Android 时 notifyItemMoved() 不起作用

我们的 App 中有这个功能,我们可以在其中上下拖动回收站视图项目。

在 ItemTouchHelper.Callback() 的 onMove() 中,我们调用

适配器代码是这样的

现在,早期的适配器类正在扩展 RecyclerView.Adapter() 并且我们有以下方法来使用 DiffUtils 更新我们的列表

拖放工作正常。

但是当我们从 ListAdapter 扩展我们的适配器类时,已经工作的功能(拖放)被破坏了。回收站视图中的第一个项目没有拖动到第二个项目之外,并且拖动的位置项目也没有得到更新。

恢复 ListAdapter 实现使其再次工作。

无法理解为什么当 ListAdapter 本身扩展 RecyclerView.Adapter 时这不起作用。

适配器类

}

片段内的代码片段

SimpleTouchListener 类

我们在成功时从观察者那里调用 setAdapterMethod

0 投票
0 回答
589 浏览

android - android DiffUtils.callback IndexOutOfBoundsException:索引:25,大小:30

我正在使用 diff utils 回调更新 RecyclerView 它似乎工作正常,除非我单击适配器中的视图(这会强制视图基本上随机播放)超快我的应用程序将因 IndexOutOfBoundsException 崩溃:索引:25,大小:30 ,除了根据日志它没有超出范围,我认为这是因为我在异步任务中使用 diff utils,但我认为这是如何做到的,在后台处理(好像列表很大diff utils 计算量很大)并发布到适配器?任何帮助将不胜感激,这是我的

可访问的差异工具

崩溃记录

和我的适配器中的代码

当我想更新它时,我调用 refreshDiffUtilsList

如前所述,如果我只是以一种悠闲的方式一次单击一个,那么这很好用,但是如果我向按钮发送垃圾邮件,我就会崩溃。

0 投票
1 回答
240 浏览

android - 调用 diffResult.dispatchUpdatesTo(this) 后未调用 onBindViewHolder

我通过以下方式将我的数据设置为回收站视图:

现在我面临的问题是,当我获取新的附加数据时(例如,旧列表的大小为 10,我从下一页获取下 10 个值的数据),当时我的 onBindViewHolder 被调用:

当我刷新数据并再次获取列表的第一页时,不会调用 onBindViewHolder。当我使用 notifyDataSetChanged() 时没有这样的问题。我怎么解决这个问题?

0 投票
1 回答
1946 浏览

android - DiffUtil.ItemCallback 不更新项目位置(删除后)

我使用 a 的绑定和 aListAdapter的定义DiffUtil.ItemCallback。删除项目(至少 2 个)时,我有一个IndexOutOfBoundsException. 列表的更新有效(删除后元素的数量确实是N-1)但不是项目的位置,保留的是调用。因此在调用时抛出异常getItem(position)(在 中onBindViewHolder)。注意:显示列表包含 N-1 个元素getItemCount()之前的日志。getItem(position)我创建了一个小仓库:https ://github.com/jeremy-giles/DiffListAdapterTest (与我的项目具有相同的配置),它重现了该问题。

项目适配器类

BindingUtils 类

在我的MainActivity类中,我使用 aLiveData来更新recyclerView

0 投票
1 回答
192 浏览

java - 调用 LiveData onChanged() 方法时,ListAdapter 项目呈现不正确。DiffUtil areContentsTheSame() 可能存在问题?

我目前正在创建一个可以帮助您完成任务的 Android 应用程序。我将 LiveData 与 ListAdapter 一起使用,该 ListAdapter 列出了 Fragment 和 DiffUtil 中的所有不同任务,以测试 ListAdapter 中的更改。在我解释我的问题之前:这是一些相关的代码:

子任务片段.java:

子任务适配器.java

我遇到的第一个问题是,当用户选中列表项的复选框时,列表项会变成灰色,如下所示。这不是预期的行为,因为列表项的颜色在被检查时不应该改变。未选中时不会发生这种情况。

这是此操作的日志:

我遇到的下一个可能相关的问题是,每当列表项“过期”(红色任务)并且我将其选中时,当我点击它对应的复选框时,ListAdapter 中的其他项目变为红色。这不是它应该运作的方式。这些列表项应该是白色的,因为这些任务没有过期。当我再次选中/取消选中它时,它最终再次变回白色。

检查逾期任务时,应用程序正常运行。它从屏幕上删除,因为我的 SQL SELECT 语句不再返回检查的过期任务。

这是我两次选中/取消选中非过期列表项时的日志(第 3 个 gif)。这里需要注意的一件重要的事情是,当检查 Test 1areContentsTheSame()时,在检查列表项时正确返回 false,因为 isCompleted 已从 true 设置为 false。但是,areContentsTheSame()即使 isCompleted 已从 true 设置为 false,如果未选中它,也会错误地返回 true。此外,即使 isOverdue 为 false,列表项也会突然变为红色:

我注意到的另一件事是,areItemsTheSame()列表中的每个项目都调用了两次,而areContentsTheSame()每个列表项只调用了一次。这似乎不是正常行为,因此这可能会以某种方式导致问题。关于这两个问题是否相关以及如何解决它们的任何想法?

0 投票
1 回答
102 浏览

android - 从网络获取新数据后如何将 RecyclerView 滚动到顶部;我正在使用 ListAdapter、DiffUtil

ListAdapter用来更新RecyclerView

我的适配器看起来像

我正在实现类似 google 的搜索,用户可以在其中输入搜索查询,当用户暂停时,该查询调用 API 并RecyclerView使用结果进行更新。现在,如果用户再次追加查询,数据将被提取并添加到RecyclerView. 在这里,我想RecyclerView滚动到顶部位置。

以下代码代码对我不起作用:

由于差异是在rvBillingProduct.smoothScrollToPosition(0)将数据添加到列表之前在后台线程上计算的。

我不确定当 DiffUtils 结果计算完成时如何获取回调以便我可以滚动RecyclerView

0 投票
2 回答
455 浏览

java - Android RecyclerView 比较数据并根据它更新ui

您好,我是编程新手,我刚刚创建了一个应用程序,每秒从服务器获取数据,我只想更改我的 RecyclerViews 持有者出价的背景,并询问数据是否比以前的数据更好或更低。例如,如果我的项目出价增加,然后 recyclerview 的位置改变它的背景颜色,我的出价初始数据在一秒钟后是 4000。

我只是实现了这段代码,但是当价格没有改变时,它也会随机改变背景。

0 投票
1 回答
364 浏览

java - DiffUtil.ItemCallback 有时会丢失 oldItem 并导致 areContentsTheSame() 错误地返回 true

我在DiffUtil.ItemCallback库中遇到问题,其中列表项的旧状态以某种方式最终丢失并导致oldTask具有与newTask.

当我选中/取消选中 ListAdapter 中的复选框并onChanged()在 LiveData 观察者中调用DiffUtil.ItemCallback函数时,就会发生这种情况。正如您在里面看到onBindViewHolder()的那样,该动作调用setCompleted()否定isCompleted(). 过期任务(红色)的预期行为是在选中复选框时变为白色。这是因为isOverdue()return 时只能返回isCompleted()false true

onBindViewHolder():

但是,当areContentsTheSame()尝试比较旧列表和新列表中的值时,它有时会true在不应该返回的时候返回,因为isCompleted()应该为新旧列表项返回不同的值。似乎列表项的旧状态不知何故丢失了。这会导致列表项被错误地呈现,因为onBindViewHolder()没有被调用。这是一个 GIF,显示了应用程序的行为方式。如您所见,即使选中,列表项也是红色的,即使未选中,列表项也是白色的。您还可以看到一些列表项正确呈现,但不是全部。

差异回调:

这是上面链接的 GIF 中发生的部分日志:

我确定setCompleted()更改了 的值,isCompleted()因为当您退出并重新进入活动时,它会正确呈现