#android #android-jetpack-compose #composable #lazycolumn
Вопрос:
В настоящее время в Jetpack Compose этот код выдает IllegalStateException
ошибку, потому что вы не можете вложить два составных файла с вертикальной прокруткой:
@ExperimentalFoundationApi
@Composable
fun MyLazyColumn() {
LazyColumn {
item {
Text(text = "My LazyColumn Title")
}
item {
LazyVerticalGrid(cells = GridCells.Fixed(4)) {
items(10) {
Box(
modifier = Modifier
.size(50.dp)
.padding(5.dp)
.background(Color.Gray)
)
}
}
}
}
}
Я не хочу, чтобы сама сетка прокручивалась, а просто отображала фиксированную сетку составных элементов, которые я в нее передаю. Есть ли какой-либо обходной путь для отображения сетки без прокрутки внутри a LazyColumn
?
Ответ №1:
LazyVerticalGrid
с фиксированным количеством ячеек имеет довольно простую компоновку внутри, основанную на LazyColumn
плюсе Row
.
Вместо этого вы можете реализовать gridItems
для использования с LazyColumn
:
fun LazyListScope.gridItems(
count: Int,
nColumns: Int,
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
itemContent: @Composable BoxScope.(Int) -> Unit,
) {
gridItems(
data = List(count) { it },
nColumns = nColumns,
horizontalArrangement = horizontalArrangement,
itemContent = itemContent,
)
}
fun <T> LazyListScope.gridItems(
data: List<T>,
nColumns: Int,
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
itemContent: @Composable BoxScope.(T) -> Unit,
) {
val rows = if (data.count() == 0) 0 else 1 (data.count() - 1) / nColumns
items(rows) { rowIndex ->
Row(horizontalArrangement = horizontalArrangement) {
for (columnIndex in 0 until nColumns) {
val itemIndex = rowIndex * nColumns columnIndex
if (itemIndex < data.count()) {
Box(
modifier = Modifier.weight(1f, fill = true),
propagateMinConstraints = true
) {
itemContent.invoke(this, data[itemIndex])
}
} else {
Spacer(Modifier.weight(1f, fill = true))
}
}
}
}
}
Использование:
LazyColumn {
item {
Text(text = "My LazyColumn Title")
}
// with count
gridItems(10, nColumns = 4) { index ->
Box(
modifier = Modifier
.size(50.dp)
.padding(5.dp)
.background(Color.Gray)
)
}
// or with list of items
gridItems(listOf(1,2,3), nColumns = 4) { item ->
Box(
modifier = Modifier
.size(50.dp)
.padding(5.dp)
.background(Color.Gray)
)
}
}
Комментарии:
1. Я искал способ реализовать LazyVerticalGrid внутри LazyColumn, и это идеальное решение.