问题标签 [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 - 查看更改不正确
好的,从一开始,我有一个 RecyclerView,我想在其中更改条目的颜色,如果它们被点击的话。
如果选择了 View,Recyclerview 从数据库中获取一个列表,我在其中添加了一个 bool 值。
在我的持有人中,我检查是否选择了视图并使用选择器更改颜色。
到目前为止一切顺利,但现在出现了问题。
活动开始时,旧的选定条目是彩色的,但是当我单击另一个条目时,旧条目的颜色会消失,并且点击的条目没有任何反应。我必须再次重新单击旧条目,从这一点开始,颜色更改工作正常。
viewHolder 中调用的方法
选择器
来自应该改变颜色的视图的RelativeLayout
在 onCreate 中设置的 Activity 中的变量
onClick 方法
diffutil
ProductViewModel 是 MainActivity 中的一个lateinit
在 OnCreate 我设置了 ViewModel
通用适配器调用
表道
ProductRepro
产品视图模型
MainActivity 中的观察者
在 GenericAdapter 中设置项目
我记录了我的 Diffutil,每次单击不同的项目时,日志总是正确的。我记录了选定的表变量,它总是正确的。
我不知道从这一点开始。它只发生在活动开始时,然后它工作正常。你有什么提示或什么,我可以试试。如果您需要更深入地了解代码,请告诉我,我会发布更多信息。
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
.
关于如何实现我的需求的任何指示或建议?
android - 迁移到 ListAdapter Android 时 notifyItemMoved() 不起作用
我们的 App 中有这个功能,我们可以在其中上下拖动回收站视图项目。
在 ItemTouchHelper.Callback() 的 onMove() 中,我们调用
适配器代码是这样的
现在,早期的适配器类正在扩展 RecyclerView.Adapter() 并且我们有以下方法来使用 DiffUtils 更新我们的列表
拖放工作正常。
但是当我们从 ListAdapter 扩展我们的适配器类时,已经工作的功能(拖放)被破坏了。回收站视图中的第一个项目没有拖动到第二个项目之外,并且拖动的位置项目也没有得到更新。
恢复 ListAdapter 实现使其再次工作。
无法理解为什么当 ListAdapter 本身扩展 RecyclerView.Adapter 时这不起作用。
适配器类
}
片段内的代码片段
SimpleTouchListener 类
我们在成功时从观察者那里调用 setAdapterMethod
android - android DiffUtils.callback IndexOutOfBoundsException:索引:25,大小:30
我正在使用 diff utils 回调更新 RecyclerView 它似乎工作正常,除非我单击适配器中的视图(这会强制视图基本上随机播放)超快我的应用程序将因 IndexOutOfBoundsException 崩溃:索引:25,大小:30 ,除了根据日志它没有超出范围,我认为这是因为我在异步任务中使用 diff utils,但我认为这是如何做到的,在后台处理(好像列表很大diff utils 计算量很大)并发布到适配器?任何帮助将不胜感激,这是我的
可访问的差异工具
崩溃记录
和我的适配器中的代码
当我想更新它时,我调用 refreshDiffUtilsList
如前所述,如果我只是以一种悠闲的方式一次单击一个,那么这很好用,但是如果我向按钮发送垃圾邮件,我就会崩溃。
android - 调用 diffResult.dispatchUpdatesTo(this) 后未调用 onBindViewHolder
我通过以下方式将我的数据设置为回收站视图:
现在我面临的问题是,当我获取新的附加数据时(例如,旧列表的大小为 10,我从下一页获取下 10 个值的数据),当时我的 onBindViewHolder 被调用:
当我刷新数据并再次获取列表的第一页时,不会调用 onBindViewHolder。当我使用 notifyDataSetChanged() 时没有这样的问题。我怎么解决这个问题?
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
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()
每个列表项只调用了一次。这似乎不是正常行为,因此这可能会以某种方式导致问题。关于这两个问题是否相关以及如何解决它们的任何想法?
android - 从网络获取新数据后如何将 RecyclerView 滚动到顶部;我正在使用 ListAdapter、DiffUtil
我ListAdapter
用来更新RecyclerView
。
我的适配器看起来像
我正在实现类似 google 的搜索,用户可以在其中输入搜索查询,当用户暂停时,该查询调用 API 并RecyclerView
使用结果进行更新。现在,如果用户再次追加查询,数据将被提取并添加到RecyclerView
. 在这里,我想RecyclerView
滚动到顶部位置。
以下代码代码对我不起作用:
由于差异是在rvBillingProduct.smoothScrollToPosition(0)
将数据添加到列表之前在后台线程上计算的。
我不确定当 DiffUtils 结果计算完成时如何获取回调以便我可以滚动RecyclerView
java - Android RecyclerView 比较数据并根据它更新ui
您好,我是编程新手,我刚刚创建了一个应用程序,每秒从服务器获取数据,我只想更改我的 RecyclerViews 持有者出价的背景,并询问数据是否比以前的数据更好或更低。例如,如果我的项目出价增加,然后 recyclerview 的位置改变它的背景颜色,我的出价初始数据在一秒钟后是 4000。
我只是实现了这段代码,但是当价格没有改变时,它也会随机改变背景。
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()
因为当您退出并重新进入活动时,它会正确呈现。