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
)
Je souhaite partager mes recherches au cas où quelqu'un serait intéressé:
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
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
}