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:
