Zarządzanie stanem RecyclerView

RecyclerView może wyświetlać duże ilości danych przy minimalnych zasobach graficznych. Gdy użytkownicy przewijają elementy w RecyclerView, Viewelementy, które zniknęły z ekranu, są ponownie używane do tworzenia nowych elementów podczas przewijania na ekranie. Zmiany konfiguracji, takie jak obrót urządzenia, mogą jednak zresetować stan RecyclerView, co spowoduje, że użytkownicy będą musieli ponownie przewinąć do poprzedniej pozycji na liście elementów.

RecyclerView powinien zachować stan (w szczególności pozycję przewijania) oraz stan elementów listy podczas wszystkich zmian konfiguracji.

Zachowaj stan

Ustaw zasadę przywracania stanu RecyclerView.Adapter, aby zapisać pozycję RecyclerView przewijania. Zapisywanie stanu 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łączanie zasady przywracania stanu Adapter

Włącz zasadę przywracania stanu w adapterze RecyclerView, aby pozycja przewijania RecyclerView była zachowana po zmianie 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. Zapisz stan elementów listy ze stanem

Zapisywanie stanu złożonych elementów listy RecyclerView, takich jak elementy zawierające elementy EditText. Aby na przykład zapisać stan elementu EditText, dodaj funkcję wywołania zwrotnego podobną do elementu onClick, aby rejestrować zmiany tekstu. W wywołaniu zwrotnym określ, jakie dane mają być zapisywane:

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 sekcji Activity lub Fragment. Użyj elementu ViewModel, aby przechowywać stan.

3. Dodaj stan elementu listy do Adapter

Dodaj stan elementów listy do RecyclerView.Adapter. Przekaż stan elementu do konstruktora adaptera, gdy host Activity lub Fragment zostanie utworzony:

Kotlin

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

Java

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

4. Przywracanie stanu elementu listy w ViewHolder adaptera

W RecyclerView.Adapter, gdy zwiążesz ViewHolder z elementem, przywróć stan elementu:

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

Wyniki

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

Kolekcje zawierające ten przewodnik

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

Umożliw aplikacji optymalne działanie na tabletach, urządzeniach składanych i urządzeniach z ChromeOS.

Masz pytania lub chcesz przekazać opinię?

Otwórz stronę z najczęstszymi pytaniami i poznaj krótkie przewodniki lub skontaktuj się z nami i powiedz nam, co o tym myślisz.