J'utilise Paging Library pour paginer mon ensemble de données. Ce que j'essaie de faire, c'est d'actualiser la RecyclerView
après la modification des données de ma base de données.
J'ai cette 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()
)
Et la 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()
}
}
La Adapter
est simple, donc je l'omet ici.
J'ai essayé de faire cela quand la base de données est modifiée:
fun reload(position) {
listItems.value!!.loadAround(position)
}
mais ça n'a pas aidé.
essayez d'appeler listItems.value!!.datasource.invalidate()
pas directement DataSource#invalidate()
Ce n'est pas possible. Vous pouvez uniquement invalider la liste complète: datasource.invalidate ().
J'ai le même problème avec un DataSource basé sur Firestore personnalisé. Le seul moyen de charger une partie des données sans invalider toutes les données et de faire en sorte que la mémoire flash de l'interface utilisateur soit rechargée semble être via l'intégration à la bibliothèque Room ORM de Google. Malheureusement, mes données seront mises en cache deux fois, une fois avec Firestore et une autre fois avec Room, ce qui est inutile.
Voir la documentation sous Envisagez le fonctionnement des mises à jour de contenu . La seule façon d'obtenir des mises à jour en temps réel consiste à implémenter Room avec PagedList: Si vous chargez des données directement à partir d'une base de données Room, les mises à jour sont automatiquement transférées vers l'interface utilisateur de votre application.