gpt4 book ai didi

android - 使 LazyColumn 项目与列表中最大的项目一样大

转载 作者:行者123 更新时间:2023-12-04 23:54:50 25 4
gpt4 key购买 nike

@Composable
fun PreviewLayout() {
fun getRandomString(length: Int): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}

val horizontalScrollState = rememberScrollState()

LazyColumn(
modifier = Modifier
.background(Color.Blue)
.fillMaxHeight()
.wrapContentWidth()
.horizontalScroll(horizontalScrollState)
) {
items(5) { index ->
Text(
text = getRandomString((index + 1) * 4).uppercase(),
color = Color.Black,
fontSize = 16.sp,
modifier = Modifier
.padding(8.dp)
.background(Color.Yellow)
)
}
}
}
布局预览:
Compose Layout Preview
我想让项目宽度与列表中最大的项目相同。
注意 .horizontalScroll(horizontalScrollState) ,这是为了允许水平滚动。
我想要的:
Desirable Layout Preview
我需要使用 LazyColumn但如果我可以使用 Column我会这样写:
Column(
modifier = Modifier
.background(Color.Blue)
.horizontalScroll(horizontalScrollState)
.fillMaxHeight()
.width(IntrinsicSize.Min)
) {
repeat(5) { index ->
Text(
text = getRandomString((index + 1) * 4).uppercase(),
color = Color.Black,
fontSize = 16.sp,
modifier = Modifier
.padding(8.dp)
.fillMaxWidth()
.background(Color.Yellow)
)
}
}

最佳答案

  • 您需要单独计算最宽元素的宽度。您可以通过在 Box 中放置内容最广泛的单元格的不可见副本来做到这一点。连同 LazyColumn .
    在您的示例中很容易 - 只需获得最长的字符串。如果在实际项目中您无法确定哪个内容将是最广泛的内容,您有两种选择:
    1.1。将它们全部放在一起。只有在细胞数量有限的情况下才能做到这一点,
    1.2.否则,您必须进行一些近似并过滤出您期望最广泛的列表。
  • 因为horizontalScroll maxWidth约束为无穷大,您必须手动传递计算出的宽度。您可以通过 onSizeChanged 获取:
  • @Composable
    fun TestScreen(
    ) {
    fun getRandomString(length: Int): String {
    val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
    return (1..length)
    .map { allowedChars.random() }
    .joinToString("")
    }

    val items = remember {
    List(30) { index ->
    getRandomString((index + 1) * 4).uppercase()
    }
    }
    val maxLengthItem = remember(items) {
    items.maxByOrNull { it.length }
    }
    val (maxLengthItemWidthDp, setMaxLengthItemWidthDp) = remember {
    mutableStateOf<Dp?>(null)
    }

    val horizontalScrollState = rememberScrollState()

    Box(
    Modifier
    .background(Color.Blue)
    .horizontalScroll(horizontalScrollState)
    ) {
    LazyColumn(
    Modifier.fillMaxWidth()
    ) {
    items(items) { item ->
    Cell(
    item,
    modifier = if (maxLengthItemWidthDp != null) {
    Modifier.width(maxLengthItemWidthDp)
    } else {
    Modifier
    }
    )
    }
    }
    if (maxLengthItem != null) {
    val density = LocalDensity.current
    Cell(
    maxLengthItem,
    modifier = Modifier
    .requiredWidthIn(max = Dp.Infinity)
    .onSizeChanged {
    setMaxLengthItemWidthDp(with(density) { it.width.toDp() })
    }
    .alpha(0f)
    )
    }
    }
    }

    @Composable
    fun Cell(
    item: String,
    modifier: Modifier,
    ) {
    Text(
    text = item,
    color = Color.Black,
    fontSize = 16.sp,
    modifier = modifier
    .padding(8.dp)
    .background(Color.Yellow)
    )
    }
    结果:

    关于android - 使 LazyColumn 项目与列表中最大的项目一样大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70091840/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com