如何使用Jetpack compose实现交错网格布局?

2024-02-01

据我所知,我们只能使用Rows and Columns in Jetpack Compose显示列表。如何实现如下图所示的交错网格布局?它的正常实现使用Recyclerview交错网格布局管理器非常简单。但如何在 Jetpack Compose 中做同样的事情呢?


Google 的 Compose 示例之一Owl https://github.com/android/compose-samples/tree/main/Owl展示如何进行交错网格布局。这是用于组成此内容的代码片段:

@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
}

然后你可以在其中传递你的可组合项:

StaggeredVerticalGrid(
    maxColumnWidth = 220.dp,
    modifier = Modifier.padding(4.dp)
) {
    // Use your item composable here
}

链接到示例中的片段:https://github.com/android/compose-samples/blob/1630f6b35ac9e25fb3cd3a64208d7c9afaaaedc5/Owl/app/src/main/java/com/example/owl/ui/courses/FeaturedCourses.kt#L161 https://github.com/android/compose-samples/blob/1630f6b35ac9e25fb3cd3a64208d7c9afaaaedc5/Owl/app/src/main/java/com/example/owl/ui/courses/FeaturedCourses.kt#L161

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Jetpack compose实现交错网格布局? 的相关文章

  • 如何解决这个 java.nio.BufferOverflowException 错误?

    当我尝试使用 ADT 在 Eclipse 中编译代码时 它向我显示了此错误 2013 12 10 17 55 51 Android SDK Warning when loading the SDK Warning Ignoring buil
  • 接收广播意图时出错 { act=android.bluetooth.device.action.FOUND flg=0x10}

    我搜索了一下 没有发现任何相似的东西 我正在 Android 中使用蓝牙开发两个设备之间的连接 在 ACTION FOUND 方法上 当我尝试使设备信息显示在 listView 上时 我在 logcat 上收到该错误 德萨菲奥活动 公共类
  • Volley Json 请求不起作用 - 字符串无法转换为 JsonObject / JsonArray

    我正在开发一个 Android 应用程序并从服务器获取 JsonObject JsonArray 手动将 String 转换为 Json 可以正常工作 我最近切换到 Volley 来处理服务器请求 并且想使用JsonObjectReques
  • 如何通过单击颤动推送通知来打开特定屏幕

    我试图在单击推送通知时打开特定屏幕 我的有效负载如下所示 var payload notification title notificationTitle body notificationMessage click action scre
  • Android-无法解析符号 BaseObservable

    我正在尝试在 android 中实现数据绑定示例并使用可绑定变量创建 POJO 但我收到此错误 请帮忙 我正在关注这个教程http www vogella com tutorials AndroidDatabinding article h
  • Google 语音识别器无法在 Android 4.x 上启动

    我偶然发现了这个随机问题 这是我的代码 mSpeechRecognizer SpeechRecognizer createSpeechRecognizer mContext initializeRecognitionListener mSp
  • 通过 Wi-Fi 的 ADB 在一台 PC 上非常慢,但在另一台 PC 上则非常慢

    我正在尝试学习如何为 Android 进行开发 并且我希望能够在我的设备而不是模拟器上进行测试 我手机上的 USB 端口变得非常松动 我不想在使用它进行测试的数十个小时中弄乱它 我在桌面上通过 Wi Fi 启用了 ADB 它运行得非常完美
  • android-透明RelativeLayout

    我想要制作一个具有可绘制渐变作为背景的活动 并将在其背景顶部显示 4 个面板 相对布局 现在我想让 4 个面板透明 例如 50 以便也可以看到渐变背景 我搜索了谷歌 但我发现只能通过活动而不是布局来做到这一点 如何做我想做的事 您可以创建一
  • Eclipse 说“更新 Android Developer Toolkit”

    我不知何故弄乱了我的 Eclipse 和 Android 设置 我不知道如何修复它 问题症状如下 在 首选项 gt Android 中 我尝试选择 android sdk linux 的位置 选择时出现错误 此 Android SDK 需要
  • 方向改变后的javascript最大视口高度Android和iOS

    目标 查找设备的最大视口高度 包括设备的空间address bar这样我们就可以动态调整 min body 的大小并将内容向上推 问题 移动浏览器处理方向状态的方式不同 方向变化时更新 DOM 属性的方式也不同 使用 JavaScript
  • listItems之间的黑线,如何删除?

    我的列表项之间有一些水平黑线 如何删除它们 我的图形没有一部分 谢谢 listview setDivider null listview setDividerHeight 0 或在 XML 中
  • 如何检测屏幕何时关闭?

    是否可以检测屏幕何时关闭并捕获它 我想在 Android 的全局设置中将计时器设置为 15 秒 我正在尝试查找一些如何捕获唤醒锁定模式的信息 只需注册您的应用程序即可执行操作Intent ACTION SCREEN OFF https de
  • Apache POI 的 ProGuard 设置

    我正在构建一个使用 Apache POI 库的应用程序 当我调试应用程序 在不运行 Proguard 的情况下编译它 时 一切都运行良好 但是在导出 APK 后 当我运行应用程序并打开 Excel 文件时 出现以下异常 RuntimeExc
  • 如何在Android Studio中关联.mp3文件

    我想根据列表视图项单击播放 mp3 文件 但是根据我的代码 我运行我的应用程序 出现此窗口 因此由于缺少音频选项 我真的不知道需要选择其中哪一个为了关联我的 mp3 文件 mainList setOnItemClickListener ne
  • android listactivity onCheckedChangeListener

    我正在开发一款应用程序 并且我有一个ListActivity 其选择模式设置为choice mode multiple 现在我想重写方法 当一项被调用时调用该方法选中 未选中 我发现onCheckChanged 方法仅针对RadioGrou
  • 平移、缩放或旋转的子视图消失

    我有一个ViewGroup我向其中添加子视图 如下所示 mViewGroup addView view new LayoutParams LayoutParams WRAP CONTENT LayoutParams WRAP CONTENT
  • 使用 Android 2.x 进行实时音频流传输

    我需要在 2 x 及更高版本的设备上播放直播 This http developer android com guide appendix media formats html声明不可能在 Android 2 x 的设备上播放直播 我在这里
  • 如何等待 Kotlin 协程完成

    我读过几十篇文章 但不知何故 没有一个答案似乎适用于我的情况 我想要实现的是在Fragment中等待ViewModel使用Room执行操作 Dao Query SELECT FROM my table WHERE id id suspend
  • 是否可以从 Android Studio 恢复被覆盖的文件?

    由于错误 我覆盖了我的两个来自 android studio 的具有相同名称的项目 并且今天我已经取消了该操作 我尝试打开主项目 但发现其中没有 Java 类 只有布局文件 在我覆盖的第二个项目中 文件存在巨大混乱 并尝试使用 Androi
  • 以编程方式暂时禁用自动更新

    我有一个自行车计算机应用程序 可以在用户骑行时记录数据 我有一位用户报告了一个我没有考虑到的问题 他出去进行了一次长途骑行 100 多英里 但在外出记录数据时 该应用程序通过 Google Play 自动更新进行了更新 不幸的是 这导致应用

随机推荐

  • 如何使 Metro GridView 中的组使用不同的布局?

    我正在编写一个 Windows 8 Metro 应用程序 我正在尝试绘制一个包含三个组的 GridView 我希望其中一组的项目布局与其他组不同 我以前在 WPF 中使用过选择器 所以我认为这是一个很好的途径 所以我尝试了 GroupSty
  • AppleScript 处理程序中的可选参数

    The Applescript 文档 https developer apple com library mac documentation AppleScript Conceptual AppleScriptLangGuide conce
  • Laravel 8:注册后如何验证用户的电子邮件地址而不需要登录信息?

    我使用 Jetstream 设置了 Laravel 8 安装并实现了自定义用户注册 在成功创建数据库记录后会触发一个事件event new Registered user 初始注册过程应该不需要密码 因为将来只有选定的一组用户能够登录仪表板
  • 替换对象属性中的某些文本?

    我需要请求一些以对象形式出现的信息 我需要替换其中一个属性中的一些测试 然后将对象列表写入 CSV 当我做 Get Process select Path Replace chrome ie 我有两个问题 如果 Path 为 null 则会
  • 如何将 ltrace 用于 mpi 程序?

    我想知道如何使用 ltrace 获取 mpi 应用程序的库函数调用 但 ltrace 不起作用 我的 mpirun 无法成功 任何想法 您应该能够简单地使用 mpiexec n 4 other mpiexec options ltrace
  • Android,Intent(this,........)中的this是什么意思[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在 android SDK 中创建一个意图 但我不知道何时使用 this 值作为参数或其他值 有人可以解释 this 的用途吗 我知道
  • 如何在 sbt 0.13 中使用 sbt-scalabuff 插件?

    我正在尝试使用sbt scalabuff 插件 https github com sbt sbt scalabuff 但是sbt一直抱怨找不到插件 插件文档也没有说明解析器 url 该插件是否已弃用或者我的 Scala 版本不受支持 Det
  • 查找对象库vba的VBIDE.Reference.Name

    我发现了如何以编程方式添加引用 https stackoverflow com questions 9879825 how to add a reference programmatically与VBA 这解释了如何使用库的名称以编程方式添
  • 通过 dart2js 进行 Dart 包管理

    我正在学习 Dart 及其依赖管理器pub我很难在这里看到 透过树木看到森林 说我想用聚合物飞镖 https www dartlang org polymer dart 在我的项目中 因此 在我的项目根目录中 我创建以下内容pubspec
  • Twitter bootstrap - 在已打开的模式上打开模式

    这是我的场景 我正在打开一个包含一些记录详细信息的模式窗口 并且有一个 删除 按钮 当用户单击此按钮时 我需要在现有模式上方 上方显示 确认 模式 询问 您确定吗 但是当显示此确认模式时 它不会首先阻止 详细信息 模态 后面 有谁知道我该怎
  • Flutter:绑定尚未初始化

    将 FLutter 升级到3 0 0我在使用时遇到这个错误计算隔离 知道我已经在 main dart 中初始化了 void main async WidgetsFlutterBinding ensureInitialized 我在Flutt
  • 如何让 cscope 在搜索过程中显示完整文件路径

    当我使用以下命令搜索 C 符号或全局定义时cscope 它显示文件名和行号 我想查看完整的文件路径 以便我可以跳转到我的拱门特定文件 例如 当搜索全局定义时 switch to on cscope在 Linux 代码库上构建 我得到 Glo
  • Nodejs:查询中数组的 url.parse 问题

    http domain com action params 1 params 2 params 3 returns query params 1 2 3 params 作为名称而不是params PHP 之后 有点令人惊讶 jQuery 序
  • 自动映射器更新现有对象而不是创建新对象[重复]

    这个问题在这里已经有答案了 有什么办法可以使用吗自动映射器5 1 1更新现有对象而不是创建新对象 例如我们有一个Customer实体和一个CustomerViewModel 我们想更新现有的Customer与CustomerViewMode
  • 如何在 PHP 中通过 GET 请求传递输入名称

    我正在 PHP OOP 中构建一个网站 CMS 在这个 CMS 中 基本上有一个选项可供网站管理员更新其导航菜单项 所以它基本上看起来像这样 打印屏幕 https i stack imgur com UH1SG png 其代码如下
  • Chrome 扩展:Javascript 能否拦截文件下载并解析数据

    我正在编写一个 Chrome 扩展来自动执行我的一项日常任务 该任务的一部分是下载 csv 文件并操作数据 作为自动化的一部分 我想用 Javascript 抓取文件并让脚本操作它 问题是使用 XMLHttpRequest 获取此文件将是一
  • 如何在 SwiftUI 中为按钮创建触觉反馈

    我正在尝试在 SwiftUI 中点击按钮时实现触觉反馈 因此我尝试使用synchronousGesture 但我仍然在挣扎 我无法弄清楚水龙头何时开始 另外 Swift UI 没有实现触觉反馈 所以我想我会从 UIKit 中将它混合起来 我
  • 按两个条件分组的多个箱线图

    我在单个图中制作多个箱线图时遇到了真正的麻烦 我有五个变量 其中三个是数字 两个是因子 我想要所有三个数值变量的箱线图 但按两个因子变量分组 该图应有两组 分别为低和高 三个框为 MM ND 和 BB 图例应包含 MM ND 和 BB 的缩
  • 在pymongo中使用explain("executionStats")进行查询

    我的请求有问题 包括explain 例如 以下请求效果很好 pp pprint col find cuisine Italian name 1 address zipcode 1 address coord 1 explain 的项目清单e
  • 如何使用Jetpack compose实现交错网格布局?

    据我所知 我们只能使用Rows and Columns in Jetpack Compose显示列表 如何实现如下图所示的交错网格布局 它的正常实现使用Recyclerview交错网格布局管理器非常简单 但如何在 Jetpack Compo