【问题标题】:DiffUtil.ItemCallback areItemsTheSame() method check items twiceDiffUtil.ItemCallback areItemsTheSame() 方法检查项目两次
【发布时间】:2020-10-27 13:58:28
【问题描述】:

我向/list.php?page=1 发送请求并使用 Paging 3 组件在 UI 中显示数据。

在第一个请求中,areItemsTheSame(new, old) 方法什么都不做。没有登录Logcat。

然后我用 SwipeRefreshLayout 刷新数据并请求发送相同的 api (/list.php?page=1)。

DiffUtil.ItemCallback areItemsTheSame(new, old) 方法检查项目两次。一次是降序,然后是升序。

Logcat:

我:新项目:3308 = 旧项目:3308 我:检查:真
我:新项目:3307 = 旧项目:3307 我:检查:真
我:新项目:3306 = 旧项目:3306 我:检查:真
我:新项目:3305 = 旧项目:3305 我:检查:真
我:新项目:3304 = 旧项目:3304 我:检查:真
我:新项目:3303 = 旧项目:3303 我:检查:真
我:新项目:3302 = 旧项目:3302 我:检查:真
我:新项目:3301 = 旧项目:3301 我:检查:真
我:新项目:3300 = 旧项目:3300 我:检查:真
我:新项目:3300 = 旧项目:3300 我:检查:真
我:新项目:3301 = 旧项目:3301 我:检查:真
我:新项目:3302 = 旧项目:3302 我:检查:真
我:新项目:3303 = 旧项目:3303 我:检查:真
我:新项目:3304 = 旧项目:3304 我:检查:真
我:新项目:3305 = 旧项目:3305 我:检查:真
我:新项目:3306 = 旧项目:3306 我:检查:真
我:新项目:3307 = 旧项目:3307 我:检查:真
我:新项目:3308 = 旧项目:3308 我:检查:真

空缺片段:

适配器:

视图模型:

数据源:

【问题讨论】:

  • 请贴出更新方法的完整代码(即你调用diff util的确切位置)
  • 我添加了VacancyFragment、Adapter、ViewModel和DataSource代码
  • areContentsTheSame() 方法检查一次
  • submitData & refresh 方法,如果你不介意的话
  • 提交和刷新方法是内置方法。

标签: android kotlin android-recyclerview android-diffutils android-paging-3


【解决方案1】:

我想我找到了答案。

Myers 算法不处理被移动的项目,因此 DiffUtil 对结果运行第二次传递以检测被移动的项目。

https://developer.android.com/reference/androidx/recyclerview/widget/DiffUtil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多