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
RecyclerView.Adapter#setStateRestorationPolicy()
: specifica in che modo unRecyclerView.Adapter
ripristina il suo stato dopo una modifica della configurazione.ViewModel
: contiene lo stato di un'attività o di un fragment.
Raccolte che contengono questa guida
Questa guida fa parte di queste raccolte selezionate di guide rapide che coprono obiettivi di sviluppo Android più ampi:
