私は 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)
}
しかし、それは助けにはなりませんでした。
直接呼び出さないでlistItems.value!!.datasource.invalidate()
を呼び出そうDataSource#invalidate()
FirestoreベースのカスタムDataSourceで同じ問題が発生しています。すべてのデータを無効にせずにUIをフラッシュ/リロードすることなくデータの一部をロードする唯一の方法は、GoogleのRoom ORMライブラリと統合することです。残念ながら、これは私のデータを2回キャッシュします。1回はFirestoreで、もう1回はRoomで不要です。
Consider How Content Updates Work のドキュメントを参照してください。リアルタイム更新を行う唯一の方法は、PagedListを使用してRoomを実装することです:Roomデータベースから直接データをロードしている場合、更新は自動的にアプリのUIにプッシュされます。
不可能です。リスト全体のみを無効にすることができます:datasource.invalidate()。