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
RecyclerView.Adapter#setStateRestorationPolicy(): określa, w jaki sposób usługaRecyclerView.Adapterprzywraca 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: