Je suis assez nouveau pour développer des applications Android et j'essaie de tout faire "de la bonne manière". Donc, pour le moment, j'implémente la nouvelle Android bibliothèque de pagination dans mon projet, où je dois charger une liste d'articles à partir d'un serveur réseau.
J'ai une classe ArticlesRepository
qui renvoie une classe ArticleList
contenant des instances de ArticleListItem
que je voudrais afficher dans un RecyclerView. La liste des articles est déjà paginée sur le serveur, donc le référentiel envoie une demande pour la première page et retourne un ArticleList
avec la propriété page
définie sur 1
Et le articles
propriété contenant un List<ArticleListItem>
d'articles sur la page demandée. Je ne sais pas combien d'articles peuvent être sur une seule page.
Maintenant, j'ai pu implémenter un PageKeyedDataSource<Integer, ArticleListItem>
, Mais il ne récupère que la première page:
@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer, ArticleListItem> callback) {
ArticleList list = load(1);
if (list != null) {
callback.onResult(list.articles, null, next(list));
}
}
@Override
public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, ArticleListItem> callback) {
ArticleList list = load(previous(params.key));
if (list != null) {
callback.onResult(list.articles, previous(list));
}
}
@Override
public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, ArticleListItem> callback) {
ArticleList list = load(next(params.key));
if (list != null) {
callback.onResult(list.articles, next(list));
}
}
Les fonctions previous
/next
renvoient un Integer
avec le numéro de page précédent/suivant ou null
s'il n'y en a pas.
Dans mon ViewModel, je configure la PagedList comme ceci:
PagedList.Config config = new PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setInitialLoadSizeHint(1)
.setPageSize(1)
.setPrefetchDistance(1)
.build();
De cette façon, je peux charger la première page, mais lorsque je défile vers le bas du RecyclerView (c'est-à-dire à l'intérieur d'un NestedScrollView), rien ne se passe. Le débogage montre que la méthode PageKeyedDataSource.loadAfter
N'est pas invoquée.
Dois-je dire en quelque sorte à la PagedList que la page suivante doit être chargée, ou est-ce le travail de RecyclerView/DataSource/GodKnowsWhatElse et je fais juste quelque chose de mal? Merci pour tout conseil.
La bibliothèque de pagination doit savoir automatiquement quand charger de nouveaux éléments. Le problème dans votre implémentation est que le RecyclerView paginé est à l'intérieur d'un NestedScrollView et selon cela issue le libary n'a pas de support intégré pour cela.
lorsque vous placez recyclerview dans un parent à défilement infini, il met en page tous ses enfants car le parent fournit des dimensions infinies.
Vous devrez créer votre propre implémentation de Nested Scroll View, il y en a une ici dans ce Gist qui pourrait vous aider.
Il est également suggéré d'ajouter fillViewPort à cette vue de défilement imbriquée personnalisée:
Android: fillViewport = "true" vers un conteneur déroulant