android - Jetpack Compose 中的延迟滚动
问题描述
在 Jetpack Compose 中,Recycler 类型的视图称为 Lazy。
目前,只有 Lazy Row 和 Lazy Column。
我有一个交错网格自定义可组合,它是可滚动的。但是有没有办法让它变得懒惰?还是这样的 API 还不稳定?
解决方案
您可以通过多种方式实现相同的效果,其中之一是:
@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
,请查看发行说明
推荐阅读
- docker - 詹金斯管道异常 - 找不到码头工人
- java - 获取 java.lang.NoClassDefFoundError: javax/ws/rs/Path 当依赖项在buiild.sbt
- reactjs - Laravel mix 4 (Webpack 4) & React CSS 模块
- python - TypeError:'type'对象的描述符'__subclasses__'在尝试导入rasa_core时需要一个参数
- excel - 在 VBA 中计算十六进制字的校验和
- java - 将自己的方法应用于 h2
- python - 如何提高 Poly3DCollection 动画的速度?
- python - 在单元测试中使用补丁时模拟对象的顺序
- reactjs - 有没有办法在父块中知道您正在编辑该父块的内部块?
- azure - Azure AD 联合域的 PowerShell cmdlet(无 ADFS)