Gestire lo stato di RecyclerView

RecyclerView può visualizzare grandi quantità di dati utilizzando risorse grafiche minime. Man mano che gli utenti scorrono gli elementi in un RecyclerView, le istanze di View degli elementi che sono usciti dallo schermo vengono riutilizzate per creare nuovi elementi man mano che scorrono sullo schermo. Tuttavia, le modifiche alla configurazione, come la rotazione del dispositivo, possono reimpostare lo stato di un RecyclerView, costringendo gli utenti a scorrere di nuovo fino alla posizione precedente nell'elenco degli elementi.

RecyclerView deve mantenere il proprio stato, in particolare la posizione di scorrimento, e lo stato dei relativi elementi di elenco durante tutte le modifiche alla configurazione.

Risultati

RecyclerView è in grado di ripristinare la posizione di scorrimento e lo stato di ogni elemento nell'elenco RecyclerView.

Mantieni lo stato

Imposta il criterio di ripristino dello stato di RecyclerView.Adapter per salvare la posizione di scorrimento di RecyclerView. Salva lo stato degli elementi dell'elenco RecyclerView. Aggiungi lo stato degli elementi della lista all'adattatore RecyclerView e ripristina lo stato degli elementi della lista quando sono associati a un ViewHolder.

1. Abilita il criterio di ripristino dello stato Adapter

Attiva il criterio di ripristino dello stato dell'adattatore RecyclerView in modo che la posizione di scorrimento di RecyclerView venga mantenuta in seguito alle modifiche alla configurazione. Aggiungi la specifica dei criteri al costruttore dell'adattatore:

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. Salva lo stato degli elementi di elenco con stato

Salva lo stato di elementi di elenco RecyclerView complessi, ad esempio elementi che contengono elementi EditText. Ad esempio, per salvare lo stato di un EditText, aggiungi un callback simile a un gestore onClick per acquisire le modifiche al testo. All'interno della callback, definisci quali dati salvare:

Kotlin

input.addTextChangedListener(
    afterTextChanged = { text ->
        text?.let {
            // Save state here.
        }
    }
)

Java

input.addTextChangedListener(new TextWatcher() {

    ...

    @Override
    public void afterTextChanged(Editable s) {
        // Save state here.
    }
});

Dichiara il callback in Activity o Fragment. Utilizza un ViewModel per memorizzare lo stato.

3. Aggiungere lo stato della voce di elenco a Adapter

Aggiungi lo stato delle voci dell'elenco al RecyclerView.Adapter. Passa lo stato dell'elemento al costruttore dell'adattatore quando viene creato il tuo host Activity o Fragment:

Kotlin

val adapter = MyAdapter(items, viewModel.retrieveState())

Java

MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());

4. Recupera lo stato della voce di elenco in ViewHolder dell'adattatore

In RecyclerView.Adapter, quando associ un ViewHolder a un elemento, ripristina lo stato dell'elemento:

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));
}

Punti chiave

Raccolte che contengono questa guida

Questa guida fa parte di queste raccolte selezionate di guide rapide che coprono obiettivi di sviluppo Android più ampi:

Consenti alla tua app di supportare un'esperienza utente ottimizzata su tablet, pieghevoli e dispositivi ChromeOS.

Hai domande o feedback

Visita la nostra pagina delle domande frequenti, consulta le guide rapide o contattaci per farci sapere cosa ne pensi.