RecyclerView
może wyświetlać duże ilości danych przy minimalnych zasobach graficznych. Gdy użytkownicy przewijają elementy w RecyclerView
, View
elementy, 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
RecyclerView.Adapter#setStateRestorationPolicy()
: określa sposób przywracania stanuRecyclerView.Adapter
po zmianie konfiguracji.ViewModel
: przechowuje stan aktywności lub fragmentu.
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:
![](https://developer.android.google.cn/static/images/quick-guides/collection-illustration.png?hl=pl)