web-dev-qa-db-fra.com

Comment la bibliothèque de pagination Android Android sait-elle pour charger plus de données?

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.

14
Jacob

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

14
Levi Moreira