Zarządzanie stanem RecyclerView

RecyclerView może wyświetlać duże ilości danych przy minimalnym wykorzystaniu zasobów graficznych. Gdy użytkownicy przewijają elementy w RecyclerView, Viewinstancje elementów, które zniknęły z ekranu, są ponownie wykorzystywane do tworzenia nowych elementów, które pojawiają się na ekranie. Zmiany konfiguracji, takie jak obrót urządzenia, mogą jednak zresetować stan RecyclerView, co zmusza użytkowników do ponownego przewijania do poprzedniej pozycji na liście elementów.

RecyclerView powinien zachowywać swój stan, w szczególności pozycję przewijania, oraz stan elementów listy podczas wszystkich zmian konfiguracji.

Wyniki

RecyclerView może przywrócić pozycję przewijania i stan każdego elementu na liście RecyclerView.

Zachowaj stan

Ustaw zasadę przywracania stanu elementu RecyclerView.Adapter, aby zapisać pozycję przewijania elementu RecyclerView. Zapisz stan elementów listy RecyclerView. Dodaj stan elementów listy do adaptera RecyclerView i przywróć stan elementów listy, gdy są one powiązane z ViewHolder.

1. Włącz zasadę przywracania stanu Adapter

Włącz zasadę przywracania stanu adaptera RecyclerView, aby pozycja przewijania elementu RecyclerView była zachowywana podczas zmian konfiguracji. Dodaj specyfikację zasad do konstruktora adaptera:

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. Zapisywanie stanu elementów listy stanowej

Zapisywanie stanu złożonych elementów listy RecyclerView, np. elementów zawierających elementy EditText. Aby na przykład zapisać stan elementu EditText, dodaj wywołanie zwrotne podobne do procedury obsługi onClick, aby rejestrować zmiany tekstu. W funkcji zwrotnej określ, jakie dane chcesz zapisać:

Kotlin

input.addTextChangedListener(
    afterTextChanged = { text ->
        text?.let {
            // Save state here.
        }
    }
)

Java

input.addTextChangedListener(new TextWatcher() {

    ...

    @Override
    public void afterTextChanged(Editable s) {
        // Save state here.
    }
});

Zadeklaruj wywołanie zwrotne w Activity lub Fragment. Użyj ViewModel, aby zapisać stan.

3. Dodaj stan elementu listy do Adapter

Dodaj stan elementów listy do RecyclerView.Adapter. Przekaż stan elementu do konstruktora adaptera podczas tworzenia hosta Activity lub Fragment:

Kotlin

val adapter = MyAdapter(items, viewModel.retrieveState())

Java

MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());

4. Przywróć stan elementu listy w metodzie ViewHolder adaptera.

W RecyclerView.Adapter, gdy powiążesz ViewHolder z produktem, przywróć stan produktu:

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));
}

Najważniejsze punkty

Kolekcje, które zawierają ten przewodnik

Ten przewodnik jest częścią wyselekcjonowanych kolekcji krótkich przewodników, które obejmują szersze cele związane z programowaniem na Androida:

Włącz w aplikacji obsługę zoptymalizowanego środowiska użytkownika na tabletach, urządzeniach składanych i urządzeniach z ChromeOS.

Masz pytania lub chcesz podzielić się opinią?

Odwiedź stronę z najczęstszymi pytaniami, aby zapoznać się z przewodnikami, lub skontaktuj się z nami i podziel się swoimi przemyśleniami.