android - 有没有办法对齐 LazyColumn 底部的项目?

标签 android android-jetpack-compose android-jetpack-compose-list

我正在尝试实现一个底部带有按钮的列表,如下所示:
enter image description here
因为我不知道列表中有多少项目,所以我使用 LazyColumn .底部的按钮,只有当列表没有填满整个屏幕时才应该放在那里,如果是,按钮应该向下移动并成为列表中的最后一项。
移动 LazyColumn 内的按钮像这样:

LazyColumn(...) {
    items(items) { item -> ...}
    item { Button() } 
}
给出以下内容:
enter image description here
我尝试添加 SpacerfillMaxHeight()修饰符作为两者之间的一个项目,但它没有改变。
我还尝试添加 LazyColumnButton列内:
Column {
   LazyColumn(
        modifier = Modifier.weight(1f)
   ) {
        items(items) { item -> ...}
   }
   Button()
}
但这只会将按钮固定在底部,就好像 ColumnLinearLayout .
考虑到这一点,是否可以对齐 LazyColumn 之一?的项目,所以它总是在底部?或者,添加某种填充可用区域的空间?

最佳答案

如本文所述 closed issue可以使用 LazyColumnverticalArrangement参数通过实现 Arrangement.Vertical 来对齐底部的最后一项:

LazyColumn(verticalArrangement = remember {
    object : Arrangement.Vertical {
        override fun Density.arrange(
            totalSize: Int,
            sizes: IntArray,
            outPositions: IntArray
        ) {
            var currentOffset = 0
            sizes.forEachIndexed { index, size -> 
                if (index == sizes.lastIndex) {
                    outPositions[index] = totalSize - size
                } else {
                    outPositions[index] = currentOffset
                    currentOffset += size
                }
            }
        }
    }
})
如果您想将它与 spacedBy 一起使用在 verticalArrangement参数,就像我一样,您可以使用以下内容:
fun spacedByWithFooter(space: Dp) = object : Arrangement.Vertical {

    override val spacing = space

    override fun Density.arrange(
        totalSize: Int,
        sizes: IntArray,
        outPositions: IntArray,
    ) {
        if (sizes.isEmpty()) return
        val spacePx = space.roundToPx()

        var occupied = 0
        var lastSpace = 0

        sizes.forEachIndexed { index, size ->

            if (index == sizes.lastIndex) {
                outPositions[index] = totalSize - size
            } else {
                outPositions[index] = min(occupied, totalSize - size)
            }
            lastSpace = min(spacePx, totalSize - outPositions[index] - size)
            occupied = outPositions[index] + size + lastSpace
        }
        occupied -= lastSpace
    }
}

关于android - 有没有办法对齐 LazyColumn 底部的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68959841/

相关文章:

java - 尝试解析 JSON 数据时通过递归调用在 Android 中获取 StackOverFlowError

android - 来自 androidx.compose.animation 和 androidx.compose.animation.core 的未解析引用

android - 如何在 Jetpack Compose 中正确使用 StateFlow?

android - 应用插件请求时发生异常 [id : 'com.android.application' ] while integration Jetpack Compose

android - 未能应用插件 'com.android.internal.library' 。 Android Gradle 插件需要 Java 11 才能运行。您当前使用的是 Java 1.8

java - 滚动时,ListView Listview 项目会改变位置。为什么?

java - 每 7 天更改一次下载链接?

android - 如何获取日志并将其写入文件

android - 撰写 LazyList 部分背景

android - Jetpack Compose LazyColumn 文本消失