gpt4 book ai didi

android - 带有自定义数据源的分页库在房间更新时不更新行

转载 作者:行者123 更新时间:2023-12-04 02:28:58 24 4
gpt4 key购买 nike

我一直在执行新的 Paging LibraryRecyclerView使用基于 Architecture Components 构建的应用程序.

填充列表的数据来自 Room数据库。实际上,它是从网络中获取的,存储在本地数据库中并提供给列表。

为了提供构建列表所需的数据,我实现了自己的自定义 PageKeyedDataSource .除了一个小细节外,一切都按预期工作。列表显示后,如果列表行元素的数据发生任何变化,则不会自动更新。因此,例如,如果我的列表显示具有字段名称的项目列表,并且突然间,该字段在本地 Room 数据库中针对某个行项目进行了更新,则该列表不会自动更新行 UI。

与从 DAO 自动获取 DataSource 时不同,此行为仅在使用自定义 DataSource 时发生。 , 通过返回 DataSource Factory直接地。但是,我需要实现一个自定义数据源。

我知道它可以通过调用 DataSource 上的 invalidate() 方法来重建更新的列表。但是,如果应用程序一次显示 2 个列表(例如每个半屏),并且该项目出现在两个列表中,则需要分别为两个列表调用 invalidate()。

我想到了一个解决方案,而不是使用项目类的实例来填充每个 ViewHolder ,它使用 LiveData它的包装版本,以使每一行观察其自己的项目的更改并在必要时更新该行 UI。尽管如此,我还是看到了这种方法的一些缺点:

  • 一个 LifeCycleOwner (例如包含 RecyclerView 的 Fragment)必须传递给 PagedListAdapter然后将其转发给 ViewHolder 以观察 LiveData 包装的项目。
  • 将为每个列表的新行注册一个新的观察者,所以我根本不知道它是否有过多的计算和内存成本,考虑到它将为应用程序中的每个列表完成,其中有很多列表。
  • 由于 LifeCycleOwner 观察 LiveData 包装的项目将是,例如,包含 RecyclerView 的 Fragment,而不是 ViewHolder 本身,因此每次该项目发生更改时都会通知观察者,即使包含该项目的行不是偶数在那一刻可见,因为列表已滚动,在我看来,这似乎是一种资源浪费,可能会不必要地增加计算成本。

  • 我根本不知道,即使考虑到这些缺点,它是否看起来是一种不错的方法,或者,也许你们中的任何人都知道任何其他更清洁、更好的管理方法。

    先感谢您。

    最佳答案

    自从上次检查这个问题以来已经有一段时间了,但是对于任何感兴趣的人,这是我的问题的原因 + library我做了观察LiveData正确地来自 ViewHolder (以避免不得不使用问题中解释的解决方法)。

    我的具体问题是由于对 Kotlin 的 Data Classes 使用不当造成的。 .使用它们时,请务必注意(如文档中所述),toString()、equals()、hashCode() 和 copy() 将仅考虑在类的构造函数中声明的所有属性,而忽略那些在类的主体中声明的。一个简单的例子:

    data class MyClass1(val prop: Int, val name: String) {}

    data class MyClass2(val prop: Int) {
    var name: String = ""
    }

    fun main() {
    val a = MyClass1(1, "a")
    val b = MyClass1(1, "b")

    println(a == b) //False :) -> a.name != b.name

    val c = MyClass2(2)
    c.name = "c"
    val d = MyClass2(2)
    d.name = "d"

    println(c == d) //True!! :O -> But c.name != d.name
    }

    这在实现 PagedListAdapter 时特别重要。的 DiffCallback,就像我们在一个示例的 MyClass2 一样的场景中,无论我们更新我们的 Room 中的名称字段多少次数据库,因为 DiffCallback 的 areContentsTheSame() 方法可能总是返回 true,使得列表永远不会更新该更改。

    如果上面解释的原因不是您的问题的原因,或者您只是希望能够从 ViewHolder 正确观察 LiveData 实例,我开发了一个小型库,它为任何 ViewHolder 提供生命周期,使其能够观察 LiveData 实例正确的方法(而不必使用问题中解释的解决方法)。

    https://github.com/Sarquella/LifecycleCells

    关于android - 带有自定义数据源的分页库在房间更新时不更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50366911/

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