小编Sar*_*lla的帖子

使用自定义DataSource的分页库不会更新Room更新中的行

我一直在使用RecyclerView实现新的Paging Library,其中应用程序构建在Architecture Components之上.

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

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

仅当使用自定义DataSource时才会发生此行为,这与通过直接返回DataSource FactoryDAO自动获取DataSource不同.但是,我需要实现自定义DataSource.

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

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

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

我根本不知道,即使考虑到这些缺点,它看起来似乎是一种体面的方法,或者,如果你们中的任何人知道任何其他更清洁和更好的方法来管理它.

先感谢您.

android list android-livedata android-architecture-components android-paging

11
推荐指数
1
解决办法
886
查看次数

没有收到有关PagedList更新的通知

我在我的应用程序中使用PagedList库。

使用PagedListAdapter,一切都能按预期工作。但是,我找不到如何获得回调并收到有关PagedList已更新的通知。

在列表的ItemKeyedDataSource用于从网络获取列表的数据。此时,将调用PagedListAdapter的SubmitList,提供长度为0的PagedList。当DataSource从网络中获取数据时,将执行其callback.onResult()并更新列表的UI,以显示获取的项目。但是,这不会调用SubmitList方法,并且由于未调用onCurrentListChanged,因此我没有在适配器中找到通知此更新的方法。如何将此类更改通知适配器?

谢谢 :)

paging android kotlin android-architecture-components

5
推荐指数
1
解决办法
786
查看次数