J'ai intégré le composant de pagination dans mon application et il fonctionne parfaitement bien (ou presque). J'ai Base de données + réseau modèle. La base de données contient initialement des éléments qui sont consommés par LivePagedListBuilder
. J'observe ceci LiveData<PagedList<InboxEntity>>
et, en fin de compte, transmettre la liste à PagedListAdapter#submitList(PagedList<T> pagedList)
quelque chose comme :
LiveData<PagedList<Entity>> entities;
PagedList.Config pagedListConfig =
(new PagedList.Config.Builder()).setEnablePlaceholders(true)
.setPrefetchDistance(5)
.setEnablePlaceholders(false)
.setPageSize(10)
.setInitialLoadSizeHint(10)
.build();
entities = new LivePagedListBuilder<>(DAO.getItemList(), pagedListConfig)
entities.observe(this, new Observer<PagedList<Entity>>() {
@Override
public void onChanged(@Nullable PagedList<Entity> inboxEntities) {
inboxAdapter.submitList(inboxEntities);
isFirstLoad = false;
}
});
DAO#getItemList
renvoie à DataSource.Factory<Integer, Entity>
.
J'écoute le rappel de la limite et je déclenche un appel réseau lorsqu'il atteint la fin de la liste paginée. Cet appel alimente à nouveau la base de données.
Il y a encore une chose. J'ai enregistré AdapterDataObserver
sur la vue du recycleur car si un élément a été inséré au début, je dois faire défiler jusqu'à la position supérieure :
RecyclerView.AdapterDataObserver adapterDataObserver = new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
if (positionStart == 0) {
layoutManager.scrollToPositionWithOffset(positionStart, 0);
}
}
};
Je rencontre un problème avec ce modèle :
Après avoir effectué l'appel réseau, la base de données est à nouveau alimentée et onChanged
est appelée avec une nouvelle PagedList<Entity>
. Maintenant, est-ce que cette liste paginée contient uniquement les nouveaux éléments. Je l'ai confirmé.
Mais onItemRangeInserted
est appelée avec positionStart
comme 0
également, ce qui suggère que les éléments sont insérés au début. Mais ce n'est pas le cas. Ils sont insérés à la fin, ce qui a été confirmé par le stéthoscope de l'inspecteur.
Alors pourquoi le onItemRangeInserted
étant appelé avec positionStart
comme 0
? Il m'est difficile de distinguer quand un nouvel élément est inséré au début de l'adaptateur et quand des éléments sont insérés à la fin.
Edita:
valeur de itemCount
est de 10, ce qui correspond à la taille de ma page.
Dans DiffCallback, je compare simplement la colonne de clé primaire des deux entités en areItemsTheSame
fonction.