Gérer l'état de RecyclerView

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, View les instances des éléments qui ont défilé 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'un 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.

Résultats

Votre RecyclerView peut restaurer sa position de défilement et l'état de chaque élément de la liste RecyclerView.

Compatibilité des versions

Cette implémentation est compatible avec tous les niveaux d'API.

Dépendances

Aucune.

Conservation de l'état

Définissez la stratégie de restauration d'état de RecyclerView.Adapter pour enregistrer la RecyclerView position de défilement. Enregistrez l'état des éléments de liste 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' Activity ou Fragment hôte lors de sa création :

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 le RecyclerView.Adapter, lorsque vous associez 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

Collections contenant ce guide

Ce guide fait partie de ces collections de guides rapides organisées qui couvrent des objectifs de développement Android plus larges :

Permettez à votre application de proposer une expérience utilisateur optimisée sur les tablettes, les appareils pliables et les appareils ChromeOS.

Questions ou commentaires

Consultez notre page de questions fréquentes pour en savoir plus sur les guides rapides ou contactez-nous pour nous faire part de vos commentaires.