Gestire lo stato di RecyclerView

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

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

Mantieni lo stato

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

1. Attiva il criterio di ripristino dello stato Adapter

Attiva il criterio di ripristino dello stato dell'adattatore RecyclerView in modo che la posizione di scorrimento del RecyclerView venga mantenuta durante le modifiche alla configurazione. Aggiungi la specifica del criterio 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. Salvare lo stato degli elementi dell'elenco con stato

Salva lo stato di elementi dell'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 del testo. All'interno del callback, definisci i dati da 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. Aggiungi lo stato dell'elemento dell'elenco a Adapter

Aggiungi lo stato degli elementi dell'elenco a RecyclerView.Adapter. Passa lo stato dell'elemento al costruttore dell'adattatore quando viene creato l'host Activity o Fragment:

Kotlin

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

Java

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

4. Recupera lo stato dell'elemento dell'elenco in ViewHolder dell'adattatore

In RecyclerView.Adapter, quando colleghi 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

Risultati

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

Raccolte che contengono questa guida

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

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

Domande o feedback

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