RecyclerView
peut afficher de grandes quantités de données à l'aide de ressources graphiques minimales. Lorsque les utilisateurs font défiler les éléments d'un RecyclerView
, les instances View
des éléments qui défilent hors de l'écran sont réutilisées pour créer d'autres éléments lorsqu'ils défilent à l'écran. Toutefois, les modifications de configuration telles que la rotation de l'appareil peuvent réinitialiser l'état d'une RecyclerView
, ce qui oblige les utilisateurs à faire défiler l'écran jusqu'à leur position précédente dans la liste des éléments.
RecyclerView
doit conserver son état, en particulier sa position de défilement, ainsi que l'état de ses éléments de liste lors de toutes les modifications de configuration.
Conservation de l'état
Définissez la stratégie de restauration d'état de RecyclerView.Adapter
pour enregistrer la position de défilement RecyclerView
. Enregistrez l'état des éléments de liste de RecyclerView
. Ajoutez l'état des éléments de liste à l'adaptateur RecyclerView
, puis restaurez l'état des éléments de liste lorsqu'ils sont associés à un ViewHolder
.
1. Activer la stratégie de restauration d'état d'Adapter
Activez la stratégie de restauration d'état de l'adaptateur RecyclerView
afin que la position de défilement de RecyclerView
soit maintenue en cas de modification de la configuration. Ajoutez la spécification de stratégie au constructeur de l'adaptateur :
Kotlin
class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() { init { stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY } ... }
Java
class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public Adapter() { setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY); } ... }
2. Enregistrer l'état des éléments de liste avec état
Enregistrez l'état d'éléments de liste RecyclerView
complexes, tels que les éléments contenant des éléments EditText
. Par exemple, pour enregistrer l'état d'un EditText
, ajoutez un rappel semblable à un gestionnaire onClick
afin de capturer les modifications de texte. Dans le rappel, définissez les données à enregistrer:
Kotlin
input.addTextChangedListener( afterTextChanged = { text -> text?.let { // Save state here. } } )
Java
input.addTextChangedListener(new TextWatcher() { ... @Override public void afterTextChanged(Editable s) { // Save state here. } });
Déclarez le rappel dans votre Activity
ou votre Fragment
. Utilisez un ViewModel
pour stocker l'état.
3. Ajouter l'état de l'élément de liste à Adapter
Ajoutez l'état des éléments de liste à votre RecyclerView.Adapter
. Transmettez l'état de l'élément au constructeur de l'adaptateur lors de la création de l'Activity
ou Fragment
hôte:
Kotlin
val adapter = MyAdapter(items, viewModel.retrieveState())
Java
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
4. Récupérer l'état de l'élément de liste dans le ViewHolder
de l'adaptateur
Dans RecyclerView.Adapter
, lorsque vous liez un ViewHolder
à un élément, restaurez l'état de l'élément:
Kotlin
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { ... val item = items[position] val state = states.firstOrNull { it.item == item } if (state != null) { holder.restore(state) } }
Java
@Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { ... Item item = items[position]; Arrays.stream(states).filter(state -> state.item == item) .findFirst() .ifPresent(state -> holder.restore(state)); }
Points essentiels
RecyclerView.Adapter#setStateRestorationPolicy()
: spécifie comment unRecyclerView.Adapter
restaure son état après un changement de configuration.ViewModel
: conserve l'état d'une activité ou d'un fragment.
Résultats
Votre RecyclerView
peut désormais restaurer sa position de défilement et l'état de chaque élément de la liste RecyclerView
.
Collections contenant ce guide
Ce guide fait partie de ces collections de guides rapides sélectionnés qui couvrent des objectifs de développement Android plus larges:
![](https://developer.android.com/static/images/quick-guides/collection-illustration.png?hl=fr)