Управление состоянием RecyclerView

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:

Обеспечьте своему приложению поддержку оптимизированного пользовательского опыта на планшетах, складных устройствах и устройствах ChromeOS.

Есть вопросы или отзывы

Перейдите на нашу страницу часто задаваемых вопросов и ознакомьтесь с краткими руководствами или свяжитесь с нами и поделитесь своими мыслями.
,

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:

Обеспечьте своему приложению поддержку оптимизированного пользовательского опыта на планшетах, складных устройствах и устройствах ChromeOS.

Есть вопросы или отзывы

Перейдите на нашу страницу часто задаваемых вопросов и ознакомьтесь с краткими руководствами или свяжитесь с нами и поделитесь своими мыслями.