DiffUtil.Callback 未按预期工作

2024-02-09

我正在使用 DiffUtil.ItemCallback 和 ListAdapter 来更新 RecyclerView。

它运行得很好,但它的行为有些让我困扰。

根据文档,areContentsTheSame仅当以下情况时才应该调用方法areItemsTheSame回报true.

从文档中:

仅当 areItemsTheSame(int, int) 对于这些项目返回 true 时,才会调用此方法。

但是,就我而言,当使用新列表更新列表时,如下所示:

adapter.submitList(items.toMutableList())

DiffUtil.ItemCallback 确实会触发,但即使在areItemsTheSame回报true它不会打电话areContentTheSame马上(如预期?)但是,areItemsTheSame在不同的对象对上一次又一次地调用(我在那里使用了带有断点的调试器)。 后areItemsTheSame调用了几次并返回true,最后它确实调用了areContentTheSame有时,我看到交付的物品areContentTheSame其实不一样!!并且有不同的id!!这意味着areContentTheSame甚至不应该打电话给这两对!

这就是我的 DiffUtil 回调的实现方式:

class AppDiffCallback : DiffUtil.ItemCallback<Item?>() {

override fun areItemsTheSame(oldItem: Item, newItem: Item): Boolean {
    Timber.i("areItemsTheSame: called..")
    if (oldItem.getItemType() == newItem.getItemType()) {
        Timber.i("areItemsTheSame: done true..")
        return true
    }
    Timber.w("areItemsTheSame: done false..")
    return false
}

override fun areContentsTheSame(oldItem: Item, newItem: Item): Boolean {
    Timber.i("areContentsTheSame: called")
    if(oldItem.getItemType() != newItem.getItemType()){
        Timber.w("areContentsTheSame: itemsNotTheSame WTF???}")
        return false
    }

    return when (oldItem.getItemType()) {
        Item.HEADER -> checkHeaderContent(oldItem = oldItem as ItemHeader, newItem = newItem as ItemHeader)
        Item.ITEM_ACTION -> checkItemContent(oldItem = oldItem as ItemAction, newItem = newItem as ItemAction)
        else -> false
    }
}

   private fun checkHeaderContent(oldItem: ItemHeader, newItem: 
     ItemHeader): Boolean {
         val itemContentTheSame = oldItem.date.toDate().time == 
         newItem.date.toDate().time
         return itemContentTheSame
   }

   private fun checkItemContent(oldItem: ItemAction, newItem: ItemAction): Boolean {
        val itemContentTheSame = oldItem.action == newItem.action
        return itemContentTheSame
   }
}

此外,运行此程序时,在 logcat 中我看到许多调用areItemsTheSame with true但很少areContentTheSame

这是预期的行为吗?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DiffUtil.Callback 未按预期工作 的相关文章

  • 使用 ColorMatrix 调整亮度

    我正在尝试使用 ColorMatrix 调整图像的亮度 当尝试调整色相时 您可以在 Photoshop 中看到此选项 亮度和亮度也是两个不同的功能 但我不知道要更改哪些值才能实现此目的 目前我可以使用此代码更改色调 public stati
  • 如何通过代码检测Android上的表情符号支持

    通过代码 我可以制作一个按钮 将这 3 个表情符号插入到文本中 不过 在许多手机上 当用户单击按钮时 问题是 显示为 X X X 或者更糟糕的是 它只显示三个空白空间 我想在无法正确显示表情符号的 Android 设备上禁用并隐藏我自己的内
  • AIRPLANE_MODE 的广播接收器无法与 SDK 26 一起使用

    通常 我使用简单的代码来放置Toast当用户改变AIRPLANE MODE 并且它可以使用targetSdkVersion 25 我的 AirPlaneModeReceiver public class AirPlaneModeReceiv
  • 升级到 Proguard 4.8 后无法导出应用程序

    我刚刚将我的 Android SDK ADT 和 Proguard 升级到最新最好的版本 我的项目在调试模式下编译并运行良好 但是当我尝试导出它的签名版本 APK 时 我收到来自导出向导的错误Eclipse 控制台上没有任何错误日志消息 如
  • 清晰的图标 清晰的 Android 应用程序

    你好 下午好 关于如何提高图标的 png 质量 有什么想法吗 我使用了 Android 开发者页面上的套件 但我无法获得清晰的图像 我的意思是非常清晰 我是否需要以不同的方式加载此图标 而不仅仅是拖入我的布局 谢谢 我使用这个布局
  • 如何在 Android 中创建始终位于顶部的全屏覆盖 Activity

    我希望能够创建一个始终位于 Android 显示前面的 Activity 它不应该接收任何输入 只需将其传递到其下面的任何应用程序即可 像平视显示器之类的东西 我能够研究我需要将底层窗口类型设置为 TYPE SYSTEM ALERT 但看起
  • 如何最大限度地减少 Google API(地点)自动完成的请求量?

    我正在使用 google API 位置来自动完成位置AutoCompleteTextView 我做了几次测试 大概进行了 20 次搜索 在我的 google devs 个人资料中 写着我已经发出了 200 个 API 请求 据我所知 每次我
  • 新安装的Eclipse和Android SDK。无法让模拟器工作。挂在时钟屏幕上

    我对开发是全新的 我已经安装了 Eclipse 和 Andoid SDK 但是 我无法让模拟器工作 我已经尝试过示例记事本代码和 Hello Android 教程代码 每次我尝试运行任一应用程序时 它都会挂在时钟屏幕上 屏幕上还显示正在充电
  • 将清除会话标志设置为 FALSE 后,我丢失了已发布的值

    有人有一个合乎逻辑的解释为什么尽管我有clear session flage false当我未连接到经纪商时 我没有收到我订阅的更新的已发布消息 将 aore提到的标志设置为 false 后 我运行了我的应用程序 并且我不断向主题发布一些值
  • Android 音乐播放器应用程序:如何为服务中运行的媒体播放器设置完整的侦听器?

    我正在编写一个音乐播放器应用程序 我在服务中有 MediaPlayer 对象 问题是 我不知道如何从服务更新用户界面 例如 我想更新当前歌曲的剩余时间 但是 因为 MediaPlayer 正在服务 我无法设置 MediaPlayer 对象的
  • Android 游戏偶尔出现延迟

    我正在用 Java 制作一个简单的 Android 游戏 我注意到每 20 40 秒就会出现一些烦人的延迟 首先 我认为它们是由垃圾收集器引起的 但当我检查 LogCat 时 我发现游戏滞后时没有垃圾收集 每当游戏开始滞后时 我都会标记日志
  • 何时调用 glMatrixMode()

    我所关注的大多数 Android OpenGL ES 教程都有其 onSurfaceChanged 函数 如下所示 public void onSurfaceChanged GL10 gl int width int height gl g
  • foo.setVisibility(View.GONE) 和parent.removeView(foo) 之间的区别

    如果 foo 是一个视图 那么有什么区别foo setVisibility View GONE and fooParent removeView foo 我对两个语句之前和之后视图的内存消耗特别感兴趣 可见性设置为 GONE 的视图是否会消
  • DialogFragment 关闭事件

    我需要处理 DialogFragment 的结尾 在调用 dismiss 之后 例如 我会在关闭后 包含 片段的活动内显示一个 toast 我该如何处理该事件 覆盖onDismiss 在你的DialogFragment中 或者使用setOn
  • Android 两个 Activity 之间的共享元素转换不起作用

    在我的应用程序中 我尝试使用新引入的活动之间共享的元素 如果共享元素具有固定位置 例如 android layout gravity top 但是当视图被锚定时问题就出现了 我的第一个活动如下所示
  • 如何获取Android中的所有主屏幕?

    我是安卓开发新手 我知道每个主屏幕都是启动器中的一个工作区 我想获取屏幕上所有应用程序图标的所有位置信息 那么有没有办法获取这些屏幕对象及其图标信息的列表 ADD 我更期待的是应用程序图标和屏幕之间的关系 例如 我想要某个应用程序图标的位置
  • FCM 主题是否适合更多用户?

    我对使用主题消息有点困惑 我的场景是根据通知触发一些作业 请帮助我更多地了解这一点 如果我们正在处理大量用户 则可以使用 FCM 主题向用户发送通知 我们可以只使用数据消息和主题消息吗 使用主题发送的消息是否保证送达 我在 FCM 文档中看
  • 将主题应用到 v7 支持操作栏

    我正在使用support v7库来实现ActionBar在我的应用程序中 我的styles xml file
  • 使用 PDFBox 在 Android 中创建 PDF

    我正在尝试通过我的 Android 应用程序创建 PDFPDFBoxapi 但出现以下错误 java lang NoClassDefFoundError org apache pdfbox pdmodel PDDocument 我已经将以下
  • android.view.WindowLeaked - 使用对话框和新意图时

    我已经尝试了 stackoverflow 上提供的所有可能的解决方案 但我仍然在 logcat 中遇到此错误 活动 com xyz MainActivity 泄露了最初在此处添加的窗口 com android internal policy

随机推荐

  • JQuery ajax 加载 XML,在 IE 或 Edge 中不起作用

    这是我目前拥有的 xml
  • 如何获取显示器序列号?

    有谁知道如何用 C 或 C 获取连接的显示器序列号 我找到了一些代码 但它们是用vbs编写的 我不明白 我需要一些用 C 或 C 编写的示例代码 我知道序列号是从 EDID 读取的 但不幸的是我不知道如何 有人可以帮助我吗 Thanks 更
  • 是否可以在无头模式下使用 JDT 加载 eclipse Java 项目?

    我有一个 Eclipse Java 项目 想要获取项目源目录 类路径等信息 我当前的实现解析 project文件 但由于我没有找到任何描述其结构的官方文档 project文件中 我对这种方法的稳健性有些担忧 一种更方便 更可靠的方法是使用
  • 智能指针。何时、何地以及如何?

    首先 由于智能指针有不同类型 我想将这个问题集中在其中两种 引用计数侵入式智能指针和非侵入式智能指针 针对每种指针类型单独询问该问题 我不太确定如何提出我的问题 所以这就是我不问的 我不是问为什么或何时需要智能指针 也不知道我应该使用哪种类
  • 如何在运行时修改我的 App.exe.config 键?

    在我的 app config 中我有这个部分
  • CRAN 包提交 - R CMD 检查

    我正在构建一个想要提交给 CRAN 的包 我完成了 R CMD 检查 使用 devtools check 并确保在构建我的包 devtools build 之前修复所有错误 警告和注释 然后将生成的 tar gz 文件提交到 CRAN 然而
  • 单元测试、黑盒测试和白盒测试[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 什么是单元测试 黑盒测试和白盒测试 我用谷歌搜索 但我发现的所有解释都非常技术性 任何人都可以用适当的例子以简单的方式回答这个问题吗
  • Laravel 4:如果帖子不存在,则使用控制器重定向页面 - 尝试过但到目前为止失败

    我正在使用 Laravel 4 我有一个显示帖子的页面 例如example com posts 1 显示数据库中的第一篇文章 我想要做的是 如果有人尝试访问不存在的网址 则将页面重定向到索引 例如如果没有帖子编号 6 则 example c
  • 将函数包装在同一文件中

    我需要你的建议来包装我现有的功能 我来自测试团队 我需要编写单元测试用例 所以我不想依赖原始定义 所以尝试编写我自己的定义 以下是不应更改的源代码 来源 c include
  • 从 Windows 窗体迁移到 WPF...值得吗?

    我还有一个用 Windows 窗体编写的中等大小的桌面应用程序 由数据库中的 46 个表支持的几十个主要窗体 我正在考虑在 WPF 中重写 UI 但在我去那里之前 我很好奇是否有任何关于进行此类转换的战争故事 I use LLBLGen h
  • .Net 4 的 MiscUtil 会有更新吗?

    我想知道MiscUtil http www yoda arachsys com csharp miscutil 如果我没记错的话 由 Jon Skeet 维护 NET 4 是否会有更新 或者代码现在是否已移至其他地方 我的意思是 解决方案类
  • 在 Qt 中如何将 QVariant 转换为 QString,反之亦然?

    如何将 QVariant 转换为 QString 反之亦然 Thanks 从字符串 QString qs QVariant qv qs 至字符串 QString qs qv toString 提示 阅读help http doc qt io
  • Java 中是否有一个类可以对一周中的当地时间进行编码?

    我想制定一个一周一周的时间表 因为每周的时间表都是相同的 所以我需要存储的唯一信息是星期几及其发生的时间 例如 Monday 2 30pm 实际日期并不重要 时区也不重要 到目前为止 我一直在编写将日期和时间分开的代码 使用DayOfWee
  • SAAgent.class 上的 Proguard 错误

    我正在开发一个Samsung Gear与三星的应用程序accessory v1 0 0 jar 当我尝试创建签名的 apk 执行 proguard 步骤 时 我得到Unknown verification type 10 in stack
  • 将 simpleAdapter 与列表视图的图像一起使用

    我在使用简单适配器将图像放入列表视图时遇到了一些问题 我从我的在线服务器 亚马逊 获取图像 根据用户 ID 下载图像后 我尝试在列表视图中设置它们 但没有显示任何内容 也没有发生错误 下面是我的代码 looping through All
  • django图像存储cdn

    过去几个月我一直在使用rackspace CDN 以及 django imagekit 和 django cumulus 我对结果并不满意 由于超时等原因 我似乎收到了很多错误 File www django test1 omu2 src
  • 是什么导致 EXE 的大小变大?

    我的可执行文件大小为 364KB 它没有使用 Vector2D 类 因此我使用重载运算符实现了一个 我改变了我的大部分代码 point x point2 x point y point2 y to point point2 这导致我删除了近
  • 使用 WebClient 的 Silverlight 后台线程

    我正在使用一个WebClient从我的网络服务异步获取信息 wc DownloadStringCompleted DownloadStringCompleted wc DownloadStringAsync service 我工作得很好 但
  • React-Native 最低 Android API 级别

    我正在对react native和android进行一些研究 有谁知道android的最低api级别react native支持吗 我搜索了他们的文档页面 但找不到它 支持的操作系统 gt Android 4 1 API 16 和 gt i
  • DiffUtil.Callback 未按预期工作

    我正在使用 DiffUtil ItemCallback 和 ListAdapter 来更新 RecyclerView 它运行得很好 但它的行为有些让我困扰 根据文档 areContentsTheSame仅当以下情况时才应该调用方法areIt