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

Значок оценки в три звезды

Прокручиваемые списки в Jetpack Compose, такие как LazyColumn и LazyRow, позволяют эффективно отображать большие объемы данных. Однако изменения конфигурации, такие как поворот устройства или складывание/раскладывание складного устройства, могут сбросить состояние списка, заставляя пользователей снова прокручивать его до предыдущей позиции.

Рекомендации

Прокручиваемые списки должны сохранять свое состояние, в частности позицию прокрутки, и состояние отдельных элементов списка (например, полей ввода текста) во время всех изменений конфигурации, чтобы обеспечить удобство работы пользователей.

Ингредиенты

  • rememberLazyListState() создает и запоминает LazyListState, который используется для управления позицией прокрутки списка и наблюдения за ней. Оно автоматически сохраняется при изменении конфигурации.
  • rememberSaveable запоминает значение состояния при изменении конфигурации. Это полезно для сохранения состояний отдельных элементов списка, например входных данных текстового поля.

Шаги

В Jetpack Compose сохранение позиции прокрутки списка обрабатывается автоматически, когда вы используете состояние прокрутки. Чтобы сохранить состояние отдельных сложных элементов списка (например, полей ввода TextField), используйте rememberSaveable.

1. Сохранять состояние прокрутки списка

Чтобы сохранить и восстановить позицию прокрутки списка при изменении конфигурации, создайте LazyListState с помощью rememberLazyListState() и передайте его в качестве параметра state прокручиваемого списка, например LazyColumn.

Compose автоматически сохраняет для вас позицию прокрутки.

2. Сохранять состояние отдельных элементов списка

Если ваш список содержит элементы с отслеживанием состояния (например, элементы с текстовыми полями), состояние этих отдельных элементов может быть потеряно, когда они прокручиваются за пределы экрана и перерабатываются, или во время изменения конфигурации.

Чтобы сохранить состояние отдельного элемента, используйте rememberSaveable в области элемента списка. Это гарантирует, что когда элемент будет перекомпонован или прокручен обратно в представление, его состояние будет восстановлено.

Ниже приведена полная компилируемая реализация, демонстрирующая восстановление состояния прокрутки и состояния элемента:

// Scroll state is automatically saved and restored by rememberLazyListState
val listState = rememberLazyListState()

LazyColumn(state = listState) {
    items(100) { index ->
        // Use rememberSaveable to preserve individual item state (e.g., text input)
        var text by rememberSaveable { mutableStateOf("") }
        TextField(
            value = text,
            onValueChange = { text = it },
            label = { Text("Item $index") }
        )
    }
}

Результаты

Теперь прокручиваемый список может восстанавливать позицию прокрутки и состояние каждого элемента в списке.

Дополнительные ресурсы