Restaurer la position de défilement de RecyclerView – Développeurs Android
Vous avez peut-être eu le problème où un RecyclerView
perd la position de défilement lorsque votre Activity
/Fragment
est recréé. Cela se produit généralement parce que le Adapter
les données sont chargées de manière asynchrone et les données n’ont pas été chargées au moment RecyclerView
doit être mis en page afin qu’il ne parvienne pas à restaurer la position de défilement.
Commençant par 1.2.0-alpha02
, RecyclerView
propose une nouvelle API pour Adapter
restauration de la disposition des blocs jusqu’à ce qu’elle soit prête. Lisez la suite pour savoir comment utiliser cette nouvelle API et comment elle fonctionne.
Il existe plusieurs façons de garantir une position de défilement correcte que vous pourriez avoir adoptée. La meilleure consiste à vous assurer que vous définissez toujours les données sur le Adapter
avant le premier passage de mise en page en mettant en cache les données que vous souhaitez afficher en mémoire, dans un ViewModel
ou dans un référentiel. Si cette approche n’était pas possible, d’autres solutions étaient soit plus compliquées, comme éviter de Adapter
sur le RecyclerView
, ce qui peut entraîner des problèmes avec des éléments tels que des en-têtes ou une mauvaise utilisation LayoutManager.onRestoreInstanceState
API.
le recyclerview:1.2.0-alpha02
est une nouvelle Adapter
qui vous permet de définir une politique de restauration de l’état (via le StateRestorationPolicy
enum). Cela a 3 options:
-
ALLOW
– le défaut état, qui restaure laRecyclerView
indiquer immédiatement, lors de la prochaine mise en page -
PREVENT_WHEN_EMPTY
– restaure leRecyclerView
indiquer uniquement lorsque l’adaptateur n’est pas vide (adapter.getItemCount() > 0
). Si vos données sont chargées en mode asynchrone, leRecyclerView
attend que les données soient chargées et seulement alors l’état est restauré. Si vous avez des éléments par défaut, comme des en-têtes ou des indicateurs de progression de chargement dans le cadre de votreAdapter
, alors vous devez utiliser lePREVENT
, sauf si les éléments par défaut sont ajoutés à l’aide deMergeAdapter
(en savoir plus ici).MergeAdapter
attend que tous ses adaptateurs soient prêts et seulement alors il restaure l’état. -
PREVENT
– toute restauration d’état est différée jusqu’à ce que vous définissiezALLOW
ouPREVENT_WHEN_EMPTY
.
Définissez la stratégie de restauration d’état sur l’adaptateur comme suit:
adapter.stateRestorationPolicy = PREVENT_WHEN_EMPTY