Estou trabalhando com uma grade vertical de 2 colunas no Jetpack Compose. Cada célula pode conter um conjunto complexo de composables (consulte DynamicGridCell abaixo). No entanto, a altura de cada célula é definida como wrapContent.
Meu objetivo é alinhar itens em cada linha pela altura do item mais alto dentro daquela linha. Em outras palavras, todas as células em uma linha devem ter a mesma altura, correspondendo à célula mais alta naquela linha.
Um exemplo visual do problema, destaquei o resultado que preciso alcançar:
Exemplo de código Aqui está um exemplo para ilustrar a configuração:
@Composable
fun DynamicLazyGridScreen(modifier: Modifier = Modifier) {
DynamicLazyGrid(elements = items, modifier = modifier)
}
@Composable
fun DynamicLazyGrid(elements: List<Item>, modifier: Modifier = Modifier) {
LazyVerticalGrid(
columns = GridCells.Fixed(2),
modifier = modifier.fillMaxSize(),
contentPadding = PaddingValues(8.dp),
verticalArrangement = Arrangement.spacedBy(8.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp),
) {
items(elements) {
DynamicGridCell(it, modifier = Modifier)
}
}
}
@Composable
private fun DynamicGridCell(item: Item, modifier: Modifier = Modifier) {
Card(
modifier = Modifier.height(IntrinsicSize.Max)
) {
Column(
modifier = modifier.heightIn(min = 300.dp, max = Dp.Infinity)
) {
Box(
modifier = Modifier
.height(100.dp)
.fillMaxWidth()
.background(color = Color.Green),
)
Spacer(modifier = Modifier.height(4.dp))
Text(
text = item.title,
modifier = Modifier
)
Spacer(modifier = Modifier.height(4.dp))
Text(
text = item.description,
modifier = Modifier
.padding(8.dp)
.fillMaxHeight()
)
}
}
}
val items = List(50) { i ->
Item(
title = "Title ${i + 1}",
description = "${generateRandomString()} ${i + 1}",
)
}
fun generateRandomString(): String {
val length = Random.nextInt(5, 300)
val chars = ('a'..'z') + ('A'..'Z') + ('0'..'9') // Characters to choose from
return (1..length)
.map { chars.random() }
.joinToString("")
}
data class Item(
val title: String,
val description: String,
)
Atualização: Esta pergunta não é semelhante a Como nivelar a altura dos itens no LazyVerticalGrid? porque, no meu caso, tenho uma célula mais complexa, não apenas uma imagem com um texto.
Esta é a melhor maneira de fazer isso, na minha opinião, sem precisar medir depois e fazer recomposições, etc., etc. Assim, você pode definir a opacidade da célula adjacente como 0f, dessa forma você terá a mesma altura em cada linha ;)
O código:
O resultado:
acho que você precisa desta função measureCellHeight()
você pode verificar este código: