web-dev-qa-db-ja.com

ページングライブラリ:データの一部をオンデマンドで再読み込みする方法

私は Paging Library を使用して、データセットにページ番号を付けます。私がやろうとしていることは、データベースのデータが変更された後に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)
}

しかし、それは助けにはなりませんでした。

10
deviant

直接呼び出さないでlistItems.value!!.datasource.invalidate()を呼び出そうDataSource#invalidate()

4
Pavel Filippov

FirestoreベースのカスタムDataSourceで同じ問題が発生しています。すべてのデータを無効にせずにUIをフラッシュ/リロードすることなくデータの一部をロードする唯一の方法は、GoogleのRoom ORMライブラリと統合することです。残念ながら、これは私のデータを2回キャッシュします。1回はFirestoreで、もう1回はRoomで不要です。

Consider How Content Updates Work のドキュメントを参照してください。リアルタイム更新を行う唯一の方法は、PagedListを使用してRoomを実装することです:Roomデータベースから直接データをロードしている場合、更新は自動的にアプリのUIにプッシュされます。

1
Adam Hurwitz

不可能です。リスト全体のみを無効にすることができます:datasource.invalidate()。

0
Malachiasz