首页 > 解决方案 > Jetpack Compose 中的延迟滚动

问题描述

在 Jetpack Compose 中,Recycler 类型的视图称为 Lazy。

目前,只有 Lazy Row 和 Lazy Column。

我有一个交错网格自定义可组合,它是可滚动的。但是有没有办法让它变得懒惰?还是这样的 API 还不稳定?

标签: androidandroid-jetpack-compose

解决方案


您可以通过多种方式实现相同的效果,其中之一是:

@Composable
fun StaggeredVerticalGrid(
    modifier: Modifier = Modifier,
    maxColumnWidth: Dp,
    children: @Composable () -> Unit
) {
    Layout(
        children = children,
        modifier = modifier
    ) { measurables, constraints ->
        check(constraints.hasBoundedWidth) {
            "Unbounded width not supported"
        }
        val columns = ceil(constraints.maxWidth / maxColumnWidth.toPx()).toInt()
        val columnWidth = constraints.maxWidth / columns
        val itemConstraints = constraints.copy(maxWidth = columnWidth)
        val colHeights = IntArray(columns) { 0 } // track each column's height
        val placeables = measurables.map { measurable ->
            val column = shortestColumn(colHeights)
            val placeable = measurable.measure(itemConstraints)
            colHeights[column] += placeable.height
            placeable
        }

        val height = colHeights.maxOrNull()?.coerceIn(constraints.minHeight, constraints.maxHeight)
            ?: constraints.minHeight
        layout(
            width = constraints.maxWidth,
            height = height
        ) {
            val colY = IntArray(columns) { 0 }
            placeables.forEach { placeable ->
                val column = shortestColumn(colY)
                placeable.place(
                    x = columnWidth * column,
                    y = colY[column]
                )
                colY[column] += placeable.height
            }
        }
    }
}

private fun shortestColumn(colHeights: IntArray): Int {
    var minHeight = Int.MAX_VALUE
    var column = 0
    colHeights.forEachIndexed { index, height ->
        if (height < minHeight) {
            minHeight = height
            column = index
        }
    }
    return column
}

Owl 示例应用程序中提取,不要忘记在里面包装/调用这个 Composable ScrollableColumn

编辑:随着 compose 1.0.0-alpha09 的发布,现在你有了官方版本LazyVerticalGrid,请查看发行说明


推荐阅读