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, 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

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:

Assurez-vous que votre application propose une expérience utilisateur optimisée sur les tablettes, les appareils pliables et les appareils ChromeOS.

Vous avez des questions ou des commentaires ?

Consultez notre page des questions fréquentes et découvrez les guides rapides, ou contactez-nous pour nous faire part de vos commentaires.