RecyclerView
kann große Datenmengen mit minimalen grafischen Ressourcen darstellen. Wenn Nutzer durch die Elemente in einem RecyclerView
scrollen, werden View
-Instanzen von Elementen, die nicht mehr auf dem Bildschirm zu sehen sind, wiederverwendet, um neue Elemente zu erstellen, während sie auf dem Bildschirm scrollen. Konfigurationsänderungen wie die Gerätedrehung können jedoch den Status einer RecyclerView
zurücksetzen, sodass Nutzer wieder zur vorherigen Position in der Liste der Elemente scrollen müssen.
RecyclerView
sollte seinen Status beibehalten, insbesondere die Scrollposition, und den Status seiner Listenelemente bei allen Konfigurationsänderungen.
Status beibehalten
Legen Sie die Richtlinie für die Zustandswiederherstellung der RecyclerView.Adapter
so fest, dass die RecyclerView
-Scrollposition gespeichert wird. Speichern Sie den Status der RecyclerView
-Listenelemente. Fügen Sie dem RecyclerView
-Adapter den Status der Listenelemente hinzu und stellen Sie den Status der Listenelemente wieder her, wenn sie an eine ViewHolder
gebunden sind.
1. Richtlinie zum Wiederherstellen des Adapter
-Status aktivieren
Aktivieren Sie die Richtlinie zur Zustandswiederherstellung des RecyclerView
-Adapters, damit die Scrollposition des RecyclerView
bei Konfigurationsänderungen beibehalten wird. Fügen Sie dem Adapterkonstruktor die Richtlinienspezifikation 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 Listenelementen mit Status speichern
Speichern Sie den Status komplexer RecyclerView
-Listenelemente, z. B. Elemente, die EditText
-Elemente enthalten. Wenn Sie beispielsweise den Status einer EditText
speichern möchten, fügen Sie einen Callback hinzu, der dem onClick
-Handler ähnelt, um Textänderungen zu erfassen. Definiere im Callback, 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 Rückruf in Ihrem Activity
oder Fragment
. Verwenden Sie einen ViewModel
, um den Status zu speichern.
3. Listenelementstatus zu Adapter
hinzufügen
Fügen Sie Ihrem RecyclerView.Adapter
den Status der Listenelemente 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. Listeneintragsstatus in ViewHolder
des Adapters wiederherstellen
Wenn du im RecyclerView.Adapter
eine ViewHolder
an ein Element bindest, kannst du den Status des Elements wiederherstellen:
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
: Speichert den Status einer Aktivität oder eines Fragments.
Ergebnisse
Auf Ihrem RecyclerView
können Sie jetzt die Scrollposition und den Status jedes Elements in der RecyclerView
-Liste wiederherstellen.
Sammlungen, die diesen Leitfaden enthalten
Dieser Leitfaden ist Teil der folgenden ausgewählten Sammlungen von Kurzanleitungen, die allgemeinere Ziele der Android-Entwicklung abdecken:
![](https://developer.android.com/static/images/quick-guides/collection-illustration.png?hl=de)