
Компонент Grid создает структурные двухмерные макеты экрана. Grid определяет адаптивную структуру макета, используя явно определенные дорожки (строки и столбцы) и промежутки в качестве базовой архитектуры вашего пользовательского интерфейса.
Поскольку Grid является структурным, а не отложенно загружаемым контейнером, он требует явного определения каждого элемента, помещенного в него, без повторного использования элементов при прокрутке. В результате, отображение больших или динамических наборов данных непосредственно в Grid может вызвать проблемы с производительностью, поскольку все элементы формируются одновременно.
Для отображения больших массивов данных в структурированной компоновке экрана встраивайте ленивые компоненты, такие как LazyColumn или LazyRow в ячейки Grid . Однако обратите внимание: гибкие дорожки (со спецификациями, например, 1.fr ) запрашивают внутренние размеры дочерних элементов. Поскольку SubcomposeLayout не поддерживает внутренние измерения, размещение ленивого списка внутри гибкой дорожки приводит к сбою IllegalStateException . Чтобы безопасно размещать ленивые списки внутри гибкой дорожки сетки, необходимо использовать размер GridTrackSize.MinMax (например minmax(0.dp, 1.fr) ), чтобы обойти внутренний этап измерения.

LazyColumn для контента.Передовые методы
- Используйте ленивые списки вместо больших явных циклов : для отображения больших или динамических наборов данных в структурированной
Grid) встраивайте ленивые компоненты (обычноLazyColumnилиLazyRow) в отдельные ячейки сетки, а не создавайте большие явные циклы по элементам, посколькуGridне переиспользует элементы повторно и имеет ограничение в 1000 дорожек. - Используйте параметр
MinMaxдля определения размера дорожек для ленивых списков : посколькуLazyColumnиLazyRowне поддерживают встроенные измерения (см.SubcomposeLayout), используйтеGridTrackSize.MinMaxна гибких дорожках, содержащих ленивые компоненты, чтобы безопасно обойти встроенные измерения.
Ингредиенты
-
Grid: Компонуемая структура, размещающая элементы в двухмерной сетке, заданной с помощью явных дорожек для строк и столбцов. -
LazyColumn: Список с вертикальной прокруткой, который формирует и повторно использует только те элементы, которые в данный момент видны на экране. -
GridTrackSize.MinMax: Свойство для определения размера трекера, которое устанавливает гибкие границы (minиmax) для безопасного размещения ленивых компонентов без сбоев, связанных с измерениями во время выполнения. -
gridItem: Расширение ComposeModifier, которое назначает дочерний элемент пользовательского интерфейса определенной ячейке или именованной области внутриGrid.
Шаги
Структурируйте макет экрана, определив идентификаторы семантических областей, настроив дорожки сетки с помощью параметра minmax для совместимости с ленивыми списками и встроив LazyColumn в область содержимого сетки.
1. Настройте сетки дорожек и именованные области.
Создайте класс enum для представления отдельных областей макета экрана и определите лямбда- GridConfigurationScope для дорожек макета и именованных областей. Используйте GridTrackSize.MaxContent для строк заголовка и нижнего колонтитула, чтобы они соответствовали размерам их содержимого, и используйте minmax(0.dp, 1.fr) для дорожки содержимого, содержащей ленивый список, чтобы выделить гибкое пространство без запроса неподдерживаемых внутренних измерений:
enum class ScreenArea { Header, Content, Footer } val lazyConfig: GridConfigurationScope.() -> Unit = { column(minmax(0.dp, 1.fr)) row(GridTrackSize.MaxContent) row(minmax(0.dp, 1.fr)) row(GridTrackSize.MaxContent) area(ScreenArea.Header, row = 1, column = 1) area(ScreenArea.Content, row = 2, column = 1) area(ScreenArea.Footer, row = 3, column = 1) gap(8.dp) }
2. Разместите статические компоненты в сетке.
В вашем компоненте передайте lazyConfig контейнеру Grid . Внутри лямбда- content разместите статические компоненты ( Header и Footer ) и расположите их с помощью Modifier.gridItem() с соответствующими идентификаторами областей.
3. Встройте LazyColumn в область контента.
В ячейку с содержимым встройте LazyColumn , используя Modifier.gridItem(ScreenArea.Content) . Поскольку на шаге 1 для дорожки содержимого был задан параметр minmax(0.dp, 1.fr) , LazyColumn может безопасно измерять и повторно использовать элементы при прокрутке, не запрашивая неподдерживаемые внутренние измерения:
@Composable fun GridWithLazyColumn( modifier: Modifier = Modifier, items: List<String> = emptyList(), ) { Grid( modifier = modifier.fillMaxSize(), config = lazyConfig ) { Text("Header", Modifier.gridItem(ScreenArea.Header).padding(16.dp)) Text("Footer", Modifier.gridItem(ScreenArea.Footer).padding(16.dp)) // LazyColumn placed in the content area for large datasets LazyColumn( modifier = Modifier .gridItem(ScreenArea.Content) .fillMaxSize(), verticalArrangement = Arrangement.spacedBy(8.dp) ) { items(items) { item -> Text(item, Modifier.padding(16.dp)) } } } }
Результаты
Теперь при компоновке экрана используется API Grid для определения общей двухмерной структуры страницы, а также встроенный LazyColumn в гибкую дорожку с возможностью изменения размера minmax для эффективного повторного использования элементов списка и предотвращения исключений во время выполнения.
Дополнительные ресурсы
,
Компонент Grid создает структурные двухмерные макеты экрана. Grid определяет адаптивную структуру макета, используя явно определенные дорожки (строки и столбцы) и промежутки в качестве базовой архитектуры вашего пользовательского интерфейса.
Поскольку Grid является структурным, а не отложенно загружаемым контейнером, он требует явного определения каждого элемента, помещенного в него, без повторного использования элементов при прокрутке. В результате, отображение больших или динамических наборов данных непосредственно в Grid может вызвать проблемы с производительностью, поскольку все элементы формируются одновременно.
Для отображения больших массивов данных в структурированной компоновке экрана встраивайте ленивые компоненты, такие как LazyColumn или LazyRow в ячейки Grid . Однако обратите внимание: гибкие дорожки (со спецификациями, например, 1.fr ) запрашивают внутренние размеры дочерних элементов. Поскольку SubcomposeLayout не поддерживает внутренние измерения, размещение ленивого списка внутри гибкой дорожки приводит к сбою IllegalStateException . Чтобы безопасно размещать ленивые списки внутри гибкой дорожки сетки, необходимо использовать размер GridTrackSize.MinMax (например minmax(0.dp, 1.fr) ), чтобы обойти внутренний этап измерения.

LazyColumn для контента.Передовые методы
- Используйте ленивые списки вместо больших явных циклов : для отображения больших или динамических наборов данных в структурированной
Grid) встраивайте ленивые компоненты (обычноLazyColumnилиLazyRow) в отдельные ячейки сетки, а не создавайте большие явные циклы по элементам, посколькуGridне переиспользует элементы повторно и имеет ограничение в 1000 дорожек. - Используйте параметр
MinMaxдля определения размера дорожек для ленивых списков : посколькуLazyColumnиLazyRowне поддерживают встроенные измерения (см.SubcomposeLayout), используйтеGridTrackSize.MinMaxна гибких дорожках, содержащих ленивые компоненты, чтобы безопасно обойти встроенные измерения.
Ингредиенты
-
Grid: Компонуемая структура, размещающая элементы в двухмерной сетке, заданной с помощью явных дорожек для строк и столбцов. -
LazyColumn: Список с вертикальной прокруткой, который формирует и повторно использует только те элементы, которые в данный момент видны на экране. -
GridTrackSize.MinMax: Свойство для определения размера трекера, которое устанавливает гибкие границы (minиmax) для безопасного размещения ленивых компонентов без сбоев, связанных с измерениями во время выполнения. -
gridItem: Расширение ComposeModifier, которое назначает дочерний элемент пользовательского интерфейса определенной ячейке или именованной области внутриGrid.
Шаги
Структурируйте макет экрана, определив идентификаторы семантических областей, настроив дорожки сетки с помощью параметра minmax для совместимости с ленивыми списками и встроив LazyColumn в область содержимого сетки.
1. Настройте сетки дорожек и именованные области.
Создайте класс enum для представления отдельных областей макета экрана и определите лямбда- GridConfigurationScope для дорожек макета и именованных областей. Используйте GridTrackSize.MaxContent для строк заголовка и нижнего колонтитула, чтобы они соответствовали размерам их содержимого, и используйте minmax(0.dp, 1.fr) для дорожки содержимого, содержащей ленивый список, чтобы выделить гибкое пространство без запроса неподдерживаемых внутренних измерений:
enum class ScreenArea { Header, Content, Footer } val lazyConfig: GridConfigurationScope.() -> Unit = { column(minmax(0.dp, 1.fr)) row(GridTrackSize.MaxContent) row(minmax(0.dp, 1.fr)) row(GridTrackSize.MaxContent) area(ScreenArea.Header, row = 1, column = 1) area(ScreenArea.Content, row = 2, column = 1) area(ScreenArea.Footer, row = 3, column = 1) gap(8.dp) }
2. Разместите статические компоненты в сетке.
В вашем компоненте передайте lazyConfig контейнеру Grid . Внутри лямбда- content разместите статические компоненты ( Header и Footer ) и расположите их с помощью Modifier.gridItem() с соответствующими идентификаторами областей.
3. Встройте LazyColumn в область контента.
В ячейку с содержимым встройте LazyColumn , используя Modifier.gridItem(ScreenArea.Content) . Поскольку на шаге 1 для дорожки содержимого был задан параметр minmax(0.dp, 1.fr) , LazyColumn может безопасно измерять и повторно использовать элементы при прокрутке, не запрашивая неподдерживаемые внутренние измерения:
@Composable fun GridWithLazyColumn( modifier: Modifier = Modifier, items: List<String> = emptyList(), ) { Grid( modifier = modifier.fillMaxSize(), config = lazyConfig ) { Text("Header", Modifier.gridItem(ScreenArea.Header).padding(16.dp)) Text("Footer", Modifier.gridItem(ScreenArea.Footer).padding(16.dp)) // LazyColumn placed in the content area for large datasets LazyColumn( modifier = Modifier .gridItem(ScreenArea.Content) .fillMaxSize(), verticalArrangement = Arrangement.spacedBy(8.dp) ) { items(items) { item -> Text(item, Modifier.padding(16.dp)) } } } }
Результаты
Теперь при компоновке экрана используется API Grid для определения общей двухмерной структуры страницы, а также встроенный LazyColumn в гибкую дорожку с возможностью изменения размера minmax для эффективного повторного использования элементов списка и предотвращения исключений во время выполнения.
Дополнительные ресурсы
,
Компонент Grid создает структурные двухмерные макеты экрана. Grid определяет адаптивную структуру макета, используя явно определенные дорожки (строки и столбцы) и промежутки в качестве базовой архитектуры вашего пользовательского интерфейса.
Поскольку Grid является структурным, а не отложенно загружаемым контейнером, он требует явного определения каждого элемента, помещенного в него, без повторного использования элементов при прокрутке. В результате, отображение больших или динамических наборов данных непосредственно в Grid может вызвать проблемы с производительностью, поскольку все элементы формируются одновременно.
Для отображения больших массивов данных в структурированной компоновке экрана встраивайте ленивые компоненты, такие как LazyColumn или LazyRow в ячейки Grid . Однако обратите внимание: гибкие дорожки (со спецификациями, например, 1.fr ) запрашивают внутренние размеры дочерних элементов. Поскольку SubcomposeLayout не поддерживает внутренние измерения, размещение ленивого списка внутри гибкой дорожки приводит к сбою IllegalStateException . Чтобы безопасно размещать ленивые списки внутри гибкой дорожки сетки, необходимо использовать размер GridTrackSize.MinMax (например minmax(0.dp, 1.fr) ), чтобы обойти внутренний этап измерения.

LazyColumn для контента.Передовые методы
- Используйте ленивые списки вместо больших явных циклов : для отображения больших или динамических наборов данных в структурированной
Grid) встраивайте ленивые компоненты (обычноLazyColumnилиLazyRow) в отдельные ячейки сетки, а не создавайте большие явные циклы по элементам, посколькуGridне переиспользует элементы повторно и имеет ограничение в 1000 дорожек. - Используйте параметр
MinMaxдля определения размера дорожек для ленивых списков : посколькуLazyColumnиLazyRowне поддерживают встроенные измерения (см.SubcomposeLayout), используйтеGridTrackSize.MinMaxна гибких дорожках, содержащих ленивые компоненты, чтобы безопасно обойти встроенные измерения.
Ингредиенты
-
Grid: Компонуемая структура, размещающая элементы в двухмерной сетке, заданной с помощью явных дорожек для строк и столбцов. -
LazyColumn: Список с вертикальной прокруткой, который формирует и повторно использует только те элементы, которые в данный момент видны на экране. -
GridTrackSize.MinMax: Свойство для определения размера трекера, которое устанавливает гибкие границы (minиmax) для безопасного размещения ленивых компонентов без сбоев, связанных с измерениями во время выполнения. -
gridItem: Расширение ComposeModifier, которое назначает дочерний элемент пользовательского интерфейса определенной ячейке или именованной области внутриGrid.
Шаги
Структурируйте макет экрана, определив идентификаторы семантических областей, настроив дорожки сетки с помощью параметра minmax для совместимости с ленивыми списками и встроив LazyColumn в область содержимого сетки.
1. Настройте сетки дорожек и именованные области.
Создайте класс enum для представления отдельных областей макета экрана и определите лямбда- GridConfigurationScope для дорожек макета и именованных областей. Используйте GridTrackSize.MaxContent для строк заголовка и нижнего колонтитула, чтобы они соответствовали размерам их содержимого, и используйте minmax(0.dp, 1.fr) для дорожки содержимого, содержащей ленивый список, чтобы выделить гибкое пространство без запроса неподдерживаемых внутренних измерений:
enum class ScreenArea { Header, Content, Footer } val lazyConfig: GridConfigurationScope.() -> Unit = { column(minmax(0.dp, 1.fr)) row(GridTrackSize.MaxContent) row(minmax(0.dp, 1.fr)) row(GridTrackSize.MaxContent) area(ScreenArea.Header, row = 1, column = 1) area(ScreenArea.Content, row = 2, column = 1) area(ScreenArea.Footer, row = 3, column = 1) gap(8.dp) }
2. Разместите статические компоненты в сетке.
В вашем компоненте передайте lazyConfig контейнеру Grid . Внутри лямбда- content разместите статические компоненты ( Header и Footer ) и расположите их с помощью Modifier.gridItem() с соответствующими идентификаторами областей.
3. Встройте LazyColumn в область контента.
В ячейку с содержимым встройте LazyColumn , используя Modifier.gridItem(ScreenArea.Content) . Поскольку на шаге 1 для дорожки содержимого был задан параметр minmax(0.dp, 1.fr) , LazyColumn может безопасно измерять и повторно использовать элементы при прокрутке, не запрашивая неподдерживаемые внутренние измерения:
@Composable fun GridWithLazyColumn( modifier: Modifier = Modifier, items: List<String> = emptyList(), ) { Grid( modifier = modifier.fillMaxSize(), config = lazyConfig ) { Text("Header", Modifier.gridItem(ScreenArea.Header).padding(16.dp)) Text("Footer", Modifier.gridItem(ScreenArea.Footer).padding(16.dp)) // LazyColumn placed in the content area for large datasets LazyColumn( modifier = Modifier .gridItem(ScreenArea.Content) .fillMaxSize(), verticalArrangement = Arrangement.spacedBy(8.dp) ) { items(items) { item -> Text(item, Modifier.padding(16.dp)) } } } }
Результаты
Теперь при компоновке экрана используется API Grid для определения общей двухмерной структуры страницы, а также встроенный LazyColumn в гибкую дорожку с возможностью изменения размера minmax для эффективного повторного использования элементов списка и предотвращения исключений во время выполнения.
Дополнительные ресурсы
,
Компонент Grid создает структурные двухмерные макеты экрана. Grid определяет адаптивную структуру макета, используя явно определенные дорожки (строки и столбцы) и промежутки в качестве базовой архитектуры вашего пользовательского интерфейса.
Поскольку Grid является структурным, а не отложенно загружаемым контейнером, он требует явного определения каждого элемента, помещенного в него, без повторного использования элементов при прокрутке. В результате, отображение больших или динамических наборов данных непосредственно в Grid может вызвать проблемы с производительностью, поскольку все элементы формируются одновременно.
Для отображения больших массивов данных в структурированной компоновке экрана встраивайте ленивые компоненты, такие как LazyColumn или LazyRow в ячейки Grid . Однако обратите внимание: гибкие дорожки (со спецификациями, например, 1.fr ) запрашивают внутренние размеры дочерних элементов. Поскольку SubcomposeLayout не поддерживает внутренние измерения, размещение ленивого списка внутри гибкой дорожки приводит к сбою IllegalStateException . Чтобы безопасно размещать ленивые списки внутри гибкой дорожки сетки, необходимо использовать размер GridTrackSize.MinMax (например minmax(0.dp, 1.fr) ), чтобы обойти внутренний этап измерения.

LazyColumn для контента.Передовые методы
- Используйте ленивые списки вместо больших явных циклов : для отображения больших или динамических наборов данных в структурированной
Grid) встраивайте ленивые компоненты (обычноLazyColumnилиLazyRow) в отдельные ячейки сетки, а не создавайте большие явные циклы по элементам, посколькуGridне переиспользует элементы повторно и имеет ограничение в 1000 дорожек. - Используйте параметр
MinMaxдля определения размера дорожек для ленивых списков : посколькуLazyColumnиLazyRowне поддерживают встроенные измерения (см.SubcomposeLayout), используйтеGridTrackSize.MinMaxна гибких дорожках, содержащих ленивые компоненты, чтобы безопасно обойти встроенные измерения.
Ингредиенты
-
Grid: Компонуемая структура, размещающая элементы в двухмерной сетке, заданной с помощью явных дорожек для строк и столбцов. -
LazyColumn: Список с вертикальной прокруткой, который формирует и повторно использует только те элементы, которые в данный момент видны на экране. -
GridTrackSize.MinMax: Свойство для определения размера трекера, которое устанавливает гибкие границы (minиmax) для безопасного размещения ленивых компонентов без сбоев, связанных с измерениями во время выполнения. -
gridItem: Расширение ComposeModifier, которое назначает дочерний элемент пользовательского интерфейса определенной ячейке или именованной области внутриGrid.
Шаги
Структурируйте макет экрана, определив идентификаторы семантических областей, настроив дорожки сетки с помощью параметра minmax для совместимости с ленивыми списками и встроив LazyColumn в область содержимого сетки.
1. Настройте сетки дорожек и именованные области.
Создайте класс enum для представления отдельных областей макета экрана и определите лямбда- GridConfigurationScope для дорожек макета и именованных областей. Используйте GridTrackSize.MaxContent для строк заголовка и нижнего колонтитула, чтобы они соответствовали размерам их содержимого, и используйте minmax(0.dp, 1.fr) для дорожки содержимого, содержащей ленивый список, чтобы выделить гибкое пространство без запроса неподдерживаемых внутренних измерений:
enum class ScreenArea { Header, Content, Footer } val lazyConfig: GridConfigurationScope.() -> Unit = { column(minmax(0.dp, 1.fr)) row(GridTrackSize.MaxContent) row(minmax(0.dp, 1.fr)) row(GridTrackSize.MaxContent) area(ScreenArea.Header, row = 1, column = 1) area(ScreenArea.Content, row = 2, column = 1) area(ScreenArea.Footer, row = 3, column = 1) gap(8.dp) }
2. Разместите статические компоненты в сетке.
В вашем компоненте передайте lazyConfig контейнеру Grid . Внутри лямбда- content разместите статические компоненты ( Header и Footer ) и расположите их с помощью Modifier.gridItem() с соответствующими идентификаторами областей.
3. Встройте LazyColumn в область контента.
В ячейку с содержимым встройте LazyColumn , используя Modifier.gridItem(ScreenArea.Content) . Поскольку на шаге 1 для дорожки содержимого был задан параметр minmax(0.dp, 1.fr) , LazyColumn может безопасно измерять и повторно использовать элементы при прокрутке, не запрашивая неподдерживаемые внутренние измерения:
@Composable fun GridWithLazyColumn( modifier: Modifier = Modifier, items: List<String> = emptyList(), ) { Grid( modifier = modifier.fillMaxSize(), config = lazyConfig ) { Text("Header", Modifier.gridItem(ScreenArea.Header).padding(16.dp)) Text("Footer", Modifier.gridItem(ScreenArea.Footer).padding(16.dp)) // LazyColumn placed in the content area for large datasets LazyColumn( modifier = Modifier .gridItem(ScreenArea.Content) .fillMaxSize(), verticalArrangement = Arrangement.spacedBy(8.dp) ) { items(items) { item -> Text(item, Modifier.padding(16.dp)) } } } }
Результаты
Теперь при компоновке экрана используется API Grid для определения общей двухмерной структуры страницы, а также встроенный LazyColumn в гибкую дорожку с возможностью изменения размера minmax для эффективного повторного использования элементов списка и предотвращения исключений во время выполнения.