RecyclerView-Status verwalten

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

Sammlungen, die diesen Leitfaden enthalten

Dieser Leitfaden ist Teil der folgenden kuratierten Sammlungen von Kurzanleitungen, die umfassendere Ziele der Android-Entwicklung abdecken:

Sorgen Sie dafür, dass Ihre App eine optimierte Nutzerfreundlichkeit auf Tablets, Foldables und ChromeOS-Geräten bietet.

Fragen oder Feedback

Auf der Seite mit den häufig gestellten Fragen finden Sie Kurzanleitungen. Sie können uns aber auch gern kontaktieren und uns Ihre Meinung mitteilen.