10

我使用分页库对我的数据集进行分页。我想要做的是RecyclerView在我的数据库中的数据被更改后刷新。

我有这个LiveData

val listItems: LiveData<PagedList<Snapshot>> = object : LivePagedListProvider<Long, Snapshot>() {
        override fun createDataSource() = SnapshotsDataSource()
    }.create(null, PagedList.Config.Builder()
        .setPageSize(PAGE_SIZE)
        .setInitialLoadSizeHint(PAGE_SIZE)
        .setEnablePlaceholders(false)
        .build()
    )

DataSource

class SnapshotsDataSource : KeyedDataSource<Long, Snapshot>(), KodeinGlobalAware {

    val db: FirebaseDb = instance()

    override fun getKey(item: Snapshot): Long = item.timestamp

    override fun loadInitial(pageSize: Int): List<Snapshot> {
        val result = db.getSnapshotsTail(pageSize)
        return result
    }

    override fun loadAfter(key: Long, pageSize: Int): List<Snapshot> {
        val result = db.getSnapshotsTail(key, pageSize)
        return result.subList(1, result.size)
    }

    override fun loadBefore(key: Long, pageSize: Int): List<Snapshot> {
        return emptyList()
    }

}

Adapter是直截了当的,所以我在这里省略它。

我尝试在修改数据库时这样做:

fun reload(position) {
    listItems.value!!.loadAround(position)
}

但这没有帮助。

4

3 回答 3

5

尝试listItems.value!!.datasource.invalidate() 不直接调用DataSource#invalidate()

于 2018-06-12T12:01:49.093 回答
1

我在使用基于 Firestore 的自定义数据源时遇到了同样的问题。加载部分数据而不使所有数据无效并让 UI 刷新/重新加载的唯一方法似乎是通过与 Google 的 Room ORM 库集成。不幸的是,这会缓存我的数据两次,一次是使用 Firestore,另一次是使用 Room,这是不必要的。

请参阅考虑内容更新如何工作下的文档。实现实时更新的唯一方法是使用 PagedList 实现 Room:如果您直接从 Room 数据库加载数据,更新会自动推送到应用程序的 UI。

于 2018-09-03T18:56:09.950 回答
1

这是不可能的。您只能使整个列表无效:datasource.invalidate()。

于 2018-12-14T13:38:54.900 回答