You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用LazyVerticalStaggeredGrid实现指定交错网格布局?

解决方案

你的核心问题是当前代码无法将蓝色元素固定在左侧列、绿色元素固定在右侧列,导致绿色元素被蓝色元素挤压到下方。以下是两种针对性的实现方案:

方案一:LazyColumn + Row 实现(高性能固定布局)

适合元素高度统一的场景,直接拆分左右列,滚动时同步联动,蓝色元素结束后左侧自然为空:

val scrollState = rememberScrollState()

Column(modifier = Modifier.fillMaxSize()) {
    // 顶部红色全屏元素
    Box(
        modifier = Modifier
            .fillMaxWidth()
            .height(100.dp)
            .background(Color.Red)
    )

    // 左右分栏,同步滚动
    Row(
        modifier = Modifier
            .fillMaxSize()
            .verticalScroll(scrollState),
        horizontalArrangement = Arrangement.spacedBy(4.dp)
    ) {
        // 左侧列:蓝色元素(固定数量)
        Column(
            modifier = Modifier.weight(1f),
            verticalArrangement = Arrangement.spacedBy(4.dp)
        ) {
            repeat(100) {
                Box(
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(100.dp)
                        .background(Color.Blue)
                )
            }
        }

        // 右侧列:绿色元素(支持数千个)
        Column(
            modifier = Modifier.weight(1f),
            verticalArrangement = Arrangement.spacedBy(4.dp)
        ) {
            repeat(1000) {
                Box(
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(200.dp)
                        .background(Color.Green)
                )
            }
        }
    }
}

方案二:LazyVerticalGrid 实现瀑布流布局

适合元素高度不固定的场景,通过插入空占位item强制蓝色元素占据左列、绿色元素占据右列:

LazyVerticalGrid(
    columns = GridCells.Fixed(2),
    verticalArrangement = Arrangement.spacedBy(4.dp),
    horizontalArrangement = Arrangement.spacedBy(4.dp),
    modifier = Modifier.fillMaxSize()
) {
    // 红色全屏元素
    item(span = { GridItemSpan(2) }) {
        Box(
            modifier = Modifier
                .fillMaxWidth()
                .height(100.dp)
                .background(Color.Red)
        )
    }

    // 蓝色元素:每个蓝色后插入空item占右列,强制蓝色在左列
    repeat(100) {
        item {
            Box(
                modifier = Modifier
                    .fillMaxWidth()
                    .height(100.dp)
                    .background(Color.Blue)
            )
        }
        // 空占位item,占用右列位置
        item {
            Box(Modifier.fillMaxWidth().height(0.dp))
        }
    }

    // 绿色元素:每个绿色前插入空item占左列,强制绿色在右列
    repeat(1000) {
        // 空占位item,占用左列位置
        item {
            Box(Modifier.fillMaxWidth().height(0.dp))
        }
        item {
            Box(
                modifier = Modifier
                    .fillMaxWidth()
                    .height(200.dp)
                    .background(Color.Green)
            )
        }
    }
}

方案说明

  • 方案一性能更优,无多余占位元素,适合高度统一的列表场景;
  • 方案二保留瀑布流特性,支持绿色元素高度动态变化,适合交错布局需求。

内容的提问来源于stack exchange,提问作者stankocken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:15:06