web-dev-qa-db-fra.com

Bibliothèque de pagination: comment recharger une partie des données à la demande?

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é.

6
deviant

essayez d'appeler listItems.value!!.datasource.invalidate() pas directement DataSource#invalidate()

2
Pavel Filippov

Ce n'est pas possible. Vous pouvez uniquement invalider la liste complète: datasource.invalidate ().

0
Malachiasz

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. 

0
Adam Hurwitz