web-dev-qa-db-fra.com

Après DataSource.Invalidate (), la nouvelle PagedList n'a qu'une seule page

J'ai une liste avec pagination que j'ai implémentée en utilisant la bibliothèque de pagination. Les éléments de cette liste peuvent être modifiés (modifiés/supprimés). Selon l'officiel documentation , je change d'abord le cache de liste en mémoire à partir duquel mon DataSource récupère les pages et après cela appelle datasource.invalidate() afin de créer une nouvelle paire PagedList/DataSource:

Si vous avez des signaux de mise à jour plus granulaires, comme une API réseau signalant une mise à jour à un seul élément de la liste, il est recommandé de charger les données du réseau dans la mémoire. Présentez ensuite ces données à la PagedList via un DataSource qui encapsule un instantané en mémoire. Chaque fois que la copie en mémoire change, invalide la DataSource précédente, et une nouvelle enveloppant le nouvel état de l'instantané peut être créée.

Cela fonctionne et semble BIEN si l'utilisateur modifie les éléments sur la première page.

Cependant, si l'utilisateur se trouve à la page deux ou plus pendant datasource.invalidate() il sera jeté à la fin de la première page .

Le débogage montre que cela se produit car le nouveau PagedList n'a que la première page lorsqu'il est soumis à PagedListAdapter.submitList. L'adaptateur compare les anciennes et les nouvelles listes et supprime tous les éléments ne figurant pas sur la première page. Cela arrive toujours mais n'est pas visible pour l'utilisateur s'il est sur la première page.

Donc, pour moi, il semble que la nouvelle paire PagedList/DataSource N'a aucune idée du nombre de pages qui ont récupéré la paire précédente et datasource.invalidate() ne convient pas à la situation dans les documents. Comportement que je vois acceptable pour les cas, puis l'utilisateur met à jour toute la liste (comme glisser pour actualiser) mais pas

une mise à jour d'un seul élément de la liste

Quelqu'un a-t-il fait face à un tel problème ou archivé les choses que je veux? Peut-être que je manque une astuce qui m'aide à obtenir de nouveaux PagedList déjà avec toutes les pages.

Pour clarification: version bibliothèque 2.1.0. PageKeyedDataSource personnalisé basé sur le cache en mémoire et la maintenance à distance (Non Room)

8
ylus

Je souhaite partager mes recherches au cas où quelqu'un serait intéressé:

  1. Le problème ("manque de fonctionnalité") est connu, au moins j'ai trouvé les discussions liées au couple sur le tracker officiel ndeux
  2. Si vous utilisez PositionalDataSource ou ItemKeyedDataSource, vous devez creuser dans la direction de requestedStartPosition/requestedInitialKey À partir des paramètres initiaux comme cette réponse dit. Je n'ai pas eu beaucoup de temps pour construire la solution entière mais ces paramètres sont en effet différents pour la charge initiale après invalidation

À propos de mon cas: PageKeyedDataSource. Ici vous pouvez lire qu'il n'y a pas de paramètres similaires à requestedInitialKey dans ce type de source de données. Pourtant, j'ai trouvé une solution qui me convient, très simple, mais qui ressemble à un sale tour:

Lorsque loadInitial() est appelé après invalidate() le cache en mémoire renvoie toutes les pages déjà chargées au lieu de la première. Au début, je craignais que quelque chose se casse si, par exemple, requestedLoadSize est égal à 5 ​​mais le résultat est une liste de 50 éléments, mais il s'avère que ce n'est qu'un indice et qu'il peut être ignoré. N'oubliez pas de passer nextPageKey qui correspond à la dernière page mise en cache et non à la première.

J'espère que cela vous aidera

6
ylus

Avec la méthode observable, vous n'obtiendrez que les éléments de la liste de première page .... si vous souhaitez modifier d'autres éléments, vous pouvez obtenir cette liste par la méthode adapter.currentlist.

Exemple:

 private fun list():MutableList<String>{
    val list = mutableListOf<String>()
        for (value in videosAdapter.currentList.orEmpty()) {
            val abc = value.snippet.resourceId.videoId
            list.add(abc)
        }
    return list
}
0
Hussnain Haidar