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

android - RecyclerView 项目在重启应用后消失

我以前使用 RecyclerView Adapter 并决定切换到 ListAdapter 以使用 DiffUtils 进行动画。起初一切似乎都很顺利,直到我从任务切换器(内存)中清除了我的应用程序。一旦我再次打开我的应用程序,所有项目都消失了,这是使用 SQLite 数据库实现的。原来我必须向 RecyclerView 添加一个新项目才能显示以前的项目。这发生在我切换到 ListAdpater 之后,我认为这是罪魁祸首。任何帮助,将不胜感激。提前致谢。

我的适配器类

在主要活动中

0 投票
1 回答
1455 浏览

android - Android 如何使用 androidx.recyclerview.widget.DiffUtil 应用多个过滤器

我正在尝试创建实现多个过滤器以在 Recyclerview 中搜索数据。

例如,在购物清单中,我可以将过滤器放在符合以下条件的计算机上。

品牌 = 苹果,屏幕尺寸 = 10 到 13 英寸,硬盘尺寸 = 250 到 500

现在,我的飞机 ViewModel 将在模型类 ResponseBase 中包含具有所有这些标准的计算机列表,这是我从后端获取的。

响应库.kt

计算机数据.kt

现在根据Android Sunflower示例, RecyclerView 可以具有DiffUtil,可用于高效过滤。

但是如何使用RecyclerView 适配器中的DiffUtil根据这样的条件过滤 ComputersData?

品牌 = 苹果 && screenSize = 10 到 13 ,硬盘 = 250 到 500

任何想法将不胜感激!

0 投票
1 回答
850 浏览

android - 嵌套recyclerView动态数据一致性

我有垂直 recyclerView,几乎没有嵌套的水平 recyclerView。每个嵌套列表都通过 DiffUtils 机制动态更新。

当我更新嵌套列表时,我等待滚动保持在相同的位置并且新项目出现在它的右侧,但滚动在页面之前。到底是怎么回事?

0 投票
1 回答
352 浏览

android - 为什么 Recyclerview 适配器 onBindViewHolder 被多次调用?

我使用本教程在我的 recyclerview中实现DiffUtil 。我的目标是将单个项目添加到 recyclerview 的底部,而无需重新加载 recyclerview 的其余部分。我使用 firestore addSnapshotListener 来调用适配器。问题是onBindViewHolder被多次调用(即列表中没有项目)。我认为使用 DiffUtil 时不会发生这种情况,对吧?它应该只为添加到 recyclerview 的项目调用 onBindViewHolder,对吗?

这是我调用适配器的代码:

这是适配器类:

我是 DiffUtil 的新手。那么,它应该发生吗?或者代码有什么问题吗?

0 投票
1 回答
880 浏览

android - DiffUtil 将错误的位置传递给 areContentsTheSame 方法

我有一个包含 25 个具有稳定 ID 的项目的列表。当用户到达底部时,RecyclerView我将获取接下来的 25 个项目并显示整个列表(50、75 等)。

DiffUtil.CallbackareItemsTheSame正在使用值调用int oldItemPosition == int newItemPosition,我正在检查 id 并且它们是相同的,每次调用都返回 true(25 次调用)。所以下一个电话将是一系列的areContentsTheSame,我也期待着int oldItemPosition == int newItemPosition,但newItemPosition总是+13 ...

两种方法的第一次调用如下所示(来自 own Log

在这些电话之后,我正在记录更改ListUpdateCallback

在重绘RecyclerView孩子之后,我看到每个项目都显示了完全不同的项目,并带有更改类型的动画(事实上,我被移到了项目 34+ 的底部,一次可见项目:4)

问题很简单:为什么?!

0 投票
0 回答
178 浏览

android - 如何使用 DiffUtil 更新另一个 RecyclerView 中的 RecyclerView 适配器

我创建了一个嵌套 RecyclerView 的视图。[1] https://drive.google.com/open?id=1WREE-iLwFVdRAVPSec4F8tYPA5Jk5Jdd “图片”

我在外部 RecyclerView 的 onBind 方法中加载内部 Recyclerview 数据。我正在尝试使用 Diffutil 更新两个视图中的数据,Diffutil 在外部 RecyclerView 中完美运行,但无法对内部 RecyclerView 使用 Diffutil 回调,因为它加载到 onBind 中。如何使用 Diffutil 使用 diffutil 更新内部 Recyclerview,或者我必须使用任何其他视图更改内部 Recyclerview。

我试图在外部 recyclerview 的 Diffutilcallback 中为内部 RecyclerView 调用 diffutil 回调,但它给出了 NullPointerException。

0 投票
1 回答
699 浏览

android - 当 DiffUtilCallBack 用于搜索或过滤列表时,是否需要使用协程暂停 DiffUtilCallBack?

使用协程暂停它是一个好习惯吗?

0 投票
3 回答
1267 浏览

android - 带有动画的 RecyclerView 和 DiffUtil 因 IndexOutOfBoundsException 崩溃:检测到不一致

我们有一个可以根据推送通知进行更新的应用程序。我们发现,有时使用动画和 DiffUtil 的 RecyclerViews,动画会使应用程序崩溃。似乎在内部,recyclerview 正在为视图设置动画,而 DiffUtil 正在对它们进行操作,从而导致此异常:

我可以通过构建一个使用 diffutil 并快速随机化值(每秒 10 次更改)的 recyclerview 来使这种重现一致。它通常需要几秒钟,因此并不一致,但最终会崩溃。禁用动画修复它。

在 DefaultItemAnimator.runPendingAnimations() 完成之前触发 diffutil 似乎会发生这种情况。每次运行时,我都会将列表的副本传递给 diffutil。

这是我们的 diffutil:

}

这是完整的堆栈跟踪:

有没有人有这方面的运气?

0 投票
0 回答
296 浏览

android - Diff Util导致Android无响应

我创建了自己的自定义过滤器视图,就像自动完成文本视图一样。

因此,为了解释,我将完整列表传递给适配器,在用户输入 3 个或更多字符后,我然后过滤列表并使用 diff util 显示。这一切都在我的适配器中完成(见下文)

还有我的 SuggestedLocationDiffCallback() :

所以这很好用,过滤显示很好,如果我删除或添加回一个项目。如果列表很大(350 多个项目),则会出现问题。我读过最好在后台线程上进行处理的文档,所以我这样做了。我将 diff util 调用改回:

更新了我的适配器以扩展RecyclerView.Adapter并在后台线程上运行,例如

不幸的是,这没有用,所以我尝试使用协程(我几乎没有或没有经验,所以我不能确定它们是否有效)

像这样调用上面的代码: CoroutineScope(Dispatchers.Default).launch {update(callback)}

然而,这也不起作用,UI 阻塞仍在发生。所以我将适配器恢复为扩展 aListAdapter并使用AsyncListDiffer

初始化如下val differ = AsyncListDiffer(this, SuggestedLocationDiffCallback())。并像使用它一样differ.submitList(newList)

不幸的是,这也不起作用,UI 阻塞仍在继续。我开始寻找分页的道路,我希望这可以解决问题,但是任何人都可以看看上面的内容,看看我是否做错了什么?

这里也是封装视图类:

当我把头发拉出来时,任何帮助都会受到赞赏。

编辑 因此,经过更多调查,似乎不是导致问题的 diffcallback 。我在绑定方法中添加了一个日志,它被称为x次数,从最后一个到显示在屏幕上有很长的延迟,bind并且在此期间ui被阻塞。

0 投票
2 回答
1246 浏览

android - OnBindViewHolder on update autoScroll to top

在适配器 submitList 到 DiffUtil 之后,调用 onBindViewHolder 并且由于某种原因它总是将列表滚动到顶部。

我尝试了 SO 中关于在 recyclerview 中更新列表时自动滚动的每一个答案,但无法解决问题。

IE

RecyclerView:禁用焦点变化引起的滚动

RecyclerView 在聊天屏幕中的 notifyDataSetChanged 上滚动到顶部

android notifyItemRangeInserted 禁用自动滚动

ETC

这是我的适配器:


因此,在每次新提交列表后,无论当前位置是什么,都会调用 onBindViewHolder,在它执行任何操作之前,列表会滚动到 0 位置,就像调用 scrollToPosition 一样。

编辑:

布局:

物品: