RecyclerView-Status verwalten

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

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:

Sorgen Sie dafür, dass Ihre App auf Tablets, faltbaren Geräten und ChromeOS-Geräten optimiert genutzt werden kann.

Hast du Fragen oder Feedback?

Auf unserer Seite mit häufig gestellten Fragen finden Sie Kurzanleitungen. Sie können sich auch gern an uns wenden.