gpt4 book ai didi

Android DiffUtil.ItemCallback areContentsTheSame 不同ID

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:46 28 4
gpt4 key购买 nike

我正在使用 RecyclerView 来显示从数据库中作为 Java 对象检索的项目列表。对象中的字段之一是数据库中项目的 ID,以便可以对其执行进一步的操作。我的 areContentsTheSame 实现比较对象中的各个字段以确定项目的内容是否已更改。

问题是,有时当刷新数据源时,项目的 ID 会发生变化,但可见内容不会发生变化(即相同的项目从数据库中删除,然后再次添加,在此过程中更改其 ID)。在这种情况下,我当前的 areContentsTheSame 实现返回 true。但是当 areContentsTheSame 返回 true 时,RecyclerView View 不会重新绑定(bind)(onBindViewHolder 不会为项目调用areContentsTheSame 返回 true),因此 View 仍然保留对包含旧 ID 的旧对象的引用,从而在尝试对该项目执行某些操作时导致错误(例如用户点击它来显示它)。

我尝试让 areContentsTheSame 在 ID 更改时返回 false,强制重新绑定(bind) View ,即使没有发生可见的更改,但这会导致“项目已更改”动画显示,即使项目没有明显改变。我想要的是一种强制重新绑定(bind) View 而不返回 areContentsTheSame 的方法 falseareContentsTheSame 返回 的方法>true 并在不显示动画的情况下触发重新绑定(bind)。

最佳答案

实现您想要的最好方法是覆盖 getChangePayload() DiffUtil.Callback 实现中的方法。

When areItemsTheSame(int, int) returns true for two items and areContentsTheSame(int, int) returns false for them, DiffUtil calls this method to get a payload about the change.

For example, if you are using DiffUtil with RecyclerView, you can return the particular field that changed in the item and your ItemAnimator can use that information to run the correct animation.

Default implementation returns null.

因此,请确保您的areContentsTheSame() 方法在数据库id 更改时返回false,然后执行getChangePayload() 来检查对于这种情况并返回一个非空值。也许是这样的:

@Override
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
if (onlyDatabaseIdChanged(oldItemPosition, newItemPosition)) {
return Boolean.FALSE;
} else {
return null;
}
}

从该方法返回什么对象并不重要,只要在您不想看到播放默认更改动画的情况下不为 null 即可。

有关为什么这行得通的更多详细信息,请参阅此问题的答案:https://stackoverflow.com/a/47355363/8298909

关于Android DiffUtil.ItemCallback areContentsTheSame 不同ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50474945/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com