Mit RecyclerView
lassen sich große Datenmengen mit minimalen grafischen Ressourcen darstellen. Wenn Nutzer durch die Elemente in einem RecyclerView
scrollen, werden View
-Instanzen von Elementen, die aus dem Bildschirm gescrollt wurden, wiederverwendet, um neue Elemente zu erstellen, während sie auf dem Bildschirm gescrollt werden. Konfigurationsänderungen wie das Drehen des Geräts können jedoch den Status von RecyclerView
zurücksetzen. Nutzer müssen dann wieder zu ihrer vorherigen Position in der Liste der Elemente scrollen.
RecyclerView
sollte seinen Status, insbesondere die Scrollposition, und den Status seiner Listenelemente bei allen Konfigurationsänderungen beibehalten.
Ergebnisse
Ihr RecyclerView
kann die Scrollposition und den Status jedes Elements in der Liste RecyclerView
wiederherstellen.
Status beibehalten
Legen Sie die Richtlinie zur Statuswiederherstellung von RecyclerView.Adapter
fest, um die Scrollposition von RecyclerView
zu speichern. Status von RecyclerView
-Listenelementen speichern Fügen Sie dem RecyclerView
-Adapter den Status der Listenelemente hinzu und stellen Sie den Status der Listenelemente wieder her, wenn sie an ein ViewHolder
gebunden sind.
1. Adapter
-Richtlinie zum Wiederherstellen des Status aktivieren
Aktivieren Sie die Richtlinie zur Wiederherstellung des Status des RecyclerView
-Adapters, damit die Scrollposition des RecyclerView
bei Konfigurationsänderungen beibehalten wird. Fügen Sie die Richtlinienspezifikation dem Adapterkonstruktor hinzu:
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. Status von zustandsorientierten Listenelementen speichern
Speichern Sie den Status komplexer RecyclerView
-Listenelemente, z. B. Elemente, die EditText
-Elemente enthalten. Wenn Sie beispielsweise den Status eines EditText
speichern möchten, fügen Sie einen Callback ähnlich einem onClick
-Handler hinzu, um Textänderungen zu erfassen. Legen Sie im Callback fest, welche Daten gespeichert werden sollen:
Kotlin
input.addTextChangedListener( afterTextChanged = { text -> text?.let { // Save state here. } } )
Java
input.addTextChangedListener(new TextWatcher() { ... @Override public void afterTextChanged(Editable s) { // Save state here. } });
Deklarieren Sie den Callback in Ihrem Activity
oder Fragment
. Verwenden Sie ein ViewModel
, um den Status zu speichern.
3. Listenelementstatus zum Adapter
hinzufügen
Fügen Sie den Status von Listenelementen zu Ihrem RecyclerView.Adapter
hinzu. Übergeben Sie den Artikelstatus an den Adapterkonstruktor, wenn Ihr Host Activity
oder Fragment
erstellt wird:
Kotlin
val adapter = MyAdapter(items, viewModel.retrieveState())
Java
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
4. Status des Listenelements im ViewHolder
des Adapters wiederherstellen
Wenn Sie im RecyclerView.Adapter
ein ViewHolder
an ein Element binden, stellen Sie den Status des Elements so wieder her:
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)); }
Wichtige Fakten
RecyclerView.Adapter#setStateRestorationPolicy()
: Gibt an, wie einRecyclerView.Adapter
seinen Status nach einer Konfigurationsänderung wiederherstellt.ViewModel
: Enthält den Status für eine Aktivität oder ein Fragment.
Sammlungen, die diesen Leitfaden enthalten
Dieser Leitfaden ist Teil der folgenden kuratierten Sammlungen von Kurzanleitungen, die umfassendere Ziele der Android-Entwicklung abdecken:
