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

Значок трехзвездочного рейтинга

Прокручиваемые списки в 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") }
        )
    }
}

Результаты

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

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