RecyclerView может отображать большие объёмы данных, используя минимальные графические ресурсы. Когда пользователи прокручивают элементы в RecyclerView , экземпляры View элементов, вышедших за пределы экрана, повторно используются для создания новых элементов по мере их прокрутки на экране. Однако изменения конфигурации, такие как поворот устройства, могут сбросить состояние RecyclerView , заставляя пользователей снова прокручивать список элементов до их предыдущей позиции.
RecyclerView должен сохранять свое состояние (в частности, положение прокрутки) и состояние элементов своего списка при всех изменениях конфигурации.
Результаты
Ваш RecyclerView способен восстанавливать позицию прокрутки и состояние каждого элемента в списке RecyclerView .
Поддерживать состояние
Настройте политику восстановления состояния RecyclerView.Adapter для сохранения позиции прокрутки RecyclerView . Сохраните состояние элементов списка RecyclerView . Добавьте состояние элементов списка в адаптер RecyclerView и восстановите состояние элементов списка при их привязке к ViewHolder .
1. Включить политику восстановления состояния Adapter
Включите политику восстановления состояния адаптера RecyclerView , чтобы положение прокрутки RecyclerView сохранялось при изменении конфигурации. Добавьте спецификацию политики в конструктор адаптера:
Котлин
class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() { init { stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY } ... }
Ява
class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public Adapter() { setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY); } ... }
2. Сохранение состояния элементов списка с сохранением состояния.
Сохраняйте состояние сложных элементов списка RecyclerView , например, содержащих элементы EditText . Например, чтобы сохранить состояние EditText , добавьте обратный вызов, аналогичный обработчику onClick для отслеживания изменений текста. В обратном вызове определите, какие данные нужно сохранять:
Котлин
input.addTextChangedListener( afterTextChanged = { text -> text?.let { // Save state here. } } )
Ява
input.addTextChangedListener(new TextWatcher() { ... @Override public void afterTextChanged(Editable s) { // Save state here. } });
Объявите обратный вызов в Activity или Fragment . Используйте ViewModel для хранения состояния.
3. Добавьте состояние элемента списка в Adapter
Добавьте состояние элементов списка в RecyclerView.Adapter . Передайте состояние элемента конструктору адаптера при создании хост Activity или Fragment :
Котлин
val adapter = MyAdapter(items, viewModel.retrieveState())
Ява
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
4. Восстановить состояние элемента списка в ViewHolder адаптера.
В RecyclerView.Adapter при привязке ViewHolder к элементу восстанавливается состояние элемента:
Котлин
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) } }
Ява
@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)); }
Ключевые моменты
-
RecyclerView.Adapter#setStateRestorationPolicy(): определяет, какRecyclerView.Adapterвосстанавливает свое состояние после изменения конфигурации. -
ViewModel: хранит состояние действия или фрагмента.
Коллекции, содержащие это руководство
Это руководство является частью тщательно подобранной коллекции кратких руководств, охватывающих более широкие цели разработки Android:

Оптимизировать для больших экранов
Есть вопросы или отзывы
RecyclerView может отображать большие объёмы данных, используя минимальные графические ресурсы. Когда пользователи прокручивают элементы в RecyclerView , экземпляры View элементов, вышедших за пределы экрана, повторно используются для создания новых элементов по мере их прокрутки на экране. Однако изменения конфигурации, такие как поворот устройства, могут сбросить состояние RecyclerView , заставляя пользователей снова прокручивать список элементов до их предыдущей позиции.
RecyclerView должен сохранять свое состояние (в частности, положение прокрутки) и состояние элементов своего списка при всех изменениях конфигурации.
Результаты
Ваш RecyclerView способен восстанавливать позицию прокрутки и состояние каждого элемента в списке RecyclerView .
Поддерживать состояние
Настройте политику восстановления состояния RecyclerView.Adapter для сохранения позиции прокрутки RecyclerView . Сохраните состояние элементов списка RecyclerView . Добавьте состояние элементов списка в адаптер RecyclerView и восстановите состояние элементов списка при их привязке к ViewHolder .
1. Включить политику восстановления состояния Adapter
Включите политику восстановления состояния адаптера RecyclerView , чтобы положение прокрутки RecyclerView сохранялось при изменении конфигурации. Добавьте спецификацию политики в конструктор адаптера:
Котлин
class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() { init { stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY } ... }
Ява
class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public Adapter() { setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY); } ... }
2. Сохранение состояния элементов списка с сохранением состояния.
Сохраняйте состояние сложных элементов списка RecyclerView , например, содержащих элементы EditText . Например, чтобы сохранить состояние EditText , добавьте обратный вызов, аналогичный обработчику onClick для отслеживания изменений текста. В обратном вызове определите, какие данные нужно сохранять:
Котлин
input.addTextChangedListener( afterTextChanged = { text -> text?.let { // Save state here. } } )
Ява
input.addTextChangedListener(new TextWatcher() { ... @Override public void afterTextChanged(Editable s) { // Save state here. } });
Объявите обратный вызов в Activity или Fragment . Используйте ViewModel для хранения состояния.
3. Добавьте состояние элемента списка в Adapter
Добавьте состояние элементов списка в RecyclerView.Adapter . Передайте состояние элемента конструктору адаптера при создании хост Activity или Fragment :
Котлин
val adapter = MyAdapter(items, viewModel.retrieveState())
Ява
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
4. Восстановить состояние элемента списка в ViewHolder адаптера.
В RecyclerView.Adapter при привязке ViewHolder к элементу восстанавливается состояние элемента:
Котлин
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) } }
Ява
@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)); }
Ключевые моменты
-
RecyclerView.Adapter#setStateRestorationPolicy(): определяет, какRecyclerView.Adapterвосстанавливает свое состояние после изменения конфигурации. -
ViewModel: хранит состояние действия или фрагмента.
Коллекции, содержащие это руководство
Это руководство является частью тщательно подобранной коллекции кратких руководств, охватывающих более широкие цели разработки Android:
