RecyclerView
może wyświetlać duże ilości danych przy minimalnym wykorzystaniu zasobów graficznych. Gdy użytkownicy przewijają elementy w RecyclerView
, View
instancje 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
RecyclerView.Adapter#setStateRestorationPolicy()
: określa, w jaki sposób usługaRecyclerView.Adapter
przywraca swój stan po zmianie konfiguracji.ViewModel
: przechowuje stan działania lub fragmentu.
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:
