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
RecyclerView.Adapter#setStateRestorationPolicy()
: specifica in che modo unRecyclerView.Adapter
ripristina il proprio stato dopo una modifica della configurazione.ViewModel
: gestisce lo stato di un'attività o di un frammento.
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:
![](https://developer.android.google.cn/static/images/quick-guides/collection-illustration.png?hl=it)