当前位置: 首页 > 知识库问答 >
问题:

固定网格内懒惰列在Jetpack撰写?

徐安康
2023-03-14

目前在Jetpack Compose中,此代码会抛出一个IllegalStateException,因为您无法嵌套两个垂直滚动的Composables:

kotlin prettyprint-override">@ExperimentalFoundationApi
@Composable
fun MyLazyColumn() {
    LazyColumn {
        item {
            Text(text = "My LazyColumn Title")
        }
        item {
            LazyVerticalGrid(cells = GridCells.Fixed(4)) {
                items(10) {
                    Box(
                        modifier = Modifier
                            .size(50.dp)
                            .padding(5.dp)
                            .background(Color.Gray)
                    )
                }
            }
        }
    }
}

我不希望网格本身滚动,而只是显示我传递到其中的可组合的固定网格。在 LazyColumn 中显示非滚动网格是否有任何解决方法?

共有3个答案

宫晟
2023-03-14

对我来说,我添加了高度明确性,它对我在懒人柱内的LazyverticalGrid起到了很好的作用

 LazyVerticalGrid(
        cells = GridCells.Fixed(3),
        contentPadding = PaddingValues(5.dp),
        modifier = Modifier
            .layoutId("lazy_list")
            .height(200.dp)
潘琨
2023-03-14

这个公认的答案很棒,在数据列表很小、网格项目的UI很简单的情况下也能很好地工作,但是当数据很大、网格项目的UI和状态很复杂时,它就会变得滞后和笨重。

在我的情况下,我设法通过使LazyVerticalGrid作为网格项目以及其他内容的容器来解决此问题,现在它看起来像这样:

val spanCount = 2
LazyVerticalGrid(
    modifier = modifier
        .fillMaxWidth(),
    cells = GridCells.Fixed(spanCount),
    state = rememberLazyGridState(),
) {
    item(
        span = {
            /** Take a full row */
            GridItemSpan(currentLineSpan = spanCount)
        }
    ) {
        Column(
            modifier = Modifier.fillMaxWidth()
        ) {
            items.forEach {
                /** Iterate over your items here */
            }
        }
    }
    items(
        items = gridItems
    ){gridItem->
        /** Grid items go here */
    }
}
孔硕
2023-03-14

如果您不介意使用不稳定的API,则可以使用LazyVerticalGrid并使项目span参数一起采用全宽,如@Mustafa指出的那样:

LazyVerticalGrid(
    cells = GridCells.Fixed(spanCount),
) {
    item(
        span = { GridItemSpan(spanCount) }
    ) {
        Text("Title")
    }
    items(10) {
        Text(it.toString())
    }
}

在稳定之前,建议

使用稳定的组件,如懒散列来实现相同的结果。

这可以通过实现网格项来实现,该网格项将与懒散列一起使用。

fun LazyListScope.gridItems(
    count: Int,
    nColumns: Int,
    horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
    itemContent: @Composable BoxScope.(Int) -> Unit,
) {
    gridItems(
        data = List(count) { it },
        nColumns = nColumns,
        horizontalArrangement = horizontalArrangement,
        itemContent = itemContent,
    )
}

fun <T> LazyListScope.gridItems(
    data: List<T>,
    nColumns: Int,
    horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
    key: ((item: T) -> Any)? = null,
    itemContent: @Composable BoxScope.(T) -> Unit,
) {
    val rows = if (data.isEmpty()) 0 else 1 + (data.count() - 1) / nColumns
    items(rows) { rowIndex ->
        Row(horizontalArrangement = horizontalArrangement) {
            for (columnIndex in 0 until nColumns) {
                val itemIndex = rowIndex * nColumns + columnIndex
                if (itemIndex < data.count()) {
                    val item = data[itemIndex]
                    androidx.compose.runtime.key(key?.invoke(item)) {
                        Box(
                            modifier = Modifier.weight(1f, fill = true),
                            propagateMinConstraints = true
                        ) {
                            itemContent.invoke(this, item)
                        }
                    }
                } else {
                    Spacer(Modifier.weight(1f, fill = true))
                }
            }
        }
    }
}

用法:

LazyColumn {
    item {
        Text(text = "My LazyColumn Title")
    }
    // with count
    gridItems(10, nColumns = 4) { index -> 
        Box(
            modifier = Modifier
                .size(50.dp)
                .padding(5.dp)
                .background(Color.Gray)
        )
    }
    // or with list of items
    gridItems(listOf(1,2,3), nColumns = 4) { item ->
        Box(
            modifier = Modifier
                .size(50.dp)
                .padding(5.dp)
                .background(Color.Gray)
        )
    }
}
 类似资料:
  • 我是jetpack compose的新手,从< code>JetpackCompose基础代码中学习它,所以我在创建一个高性能的懒惰列表中找到了它 注意:LazyColumn不会像那样回收其子项。当您滚动浏览它时,它会发出新的,并且仍然具有高性能,因为与实例化Android视图相比,发出相对便宜。 因此,发出新的可组合项是多么的便宜和高效,那么为什么不使用列并一次性组合整个列表,而不是在滚动时不断

  • 问题内容: 我想创建自己的集合,该集合具有python list的所有属性,并且还知道如何将自身保存到数据库中或从数据库中加载。我也想使负载隐式和惰性,因为在列表创建时它不会发生,而是等到第一次使用时才发生。 有没有一种单一的方法,我可以覆盖上加载任何列表属性(如第一次使用清单,,而不必重写他们… …等)? 问题答案: 不,没有。

  • 在我的Jetpack Compose项目中,我想使用Material SwipeToDismiss通过滑动删除项目。在我的可组合中,我在列表中使用列而不是懒惰列。问题在于,当删除项目时,将开始重新组合,并且所有后续项目也将被删除(因为下一个项目的 dismissState 似乎相同)。例如,如果列有 7 个项目,而我删除了项目 #5,则项目 #6 和项目 #7 也会被删除。 如果我使用一个固定高度

  • 我有4列网格窗格(fixed1,liquid,fixed2,liquide)。每个液柱的宽度必须为=(gridpane width-fixed1-fixed2)/2。换句话说,是液柱宽度的50%。重要提示:所有宽度=液体宽度固定宽度。为了设置列约束,我找到了以下代码: 但是,此代码设置的不是液体宽度的百分比,而是所有宽度的百分比。怎么做?

  • 我正在使用剑道用户界面ASP。NET MVC网格(Razor)在Ajax模式下使用弹出式编辑器。 比如说:客户有订单 应用程序的用户转到显示所有客户的网格。允许用户添加/编辑/删除客户(及其订单)。但是当用户点击编辑,弹出编辑器出现时,我想加载订单。我不想急于加载订单,因为一个客户可能有很多订单,用户可能根本不会编辑任何客户。 看起来这应该是一件简单的事情。我浏览了所有论坛/问题。我找不到这样的例

  • 我有一个数据表的问题-懒加载。我认为问题是在IdiomasBean.java(TableBean.java),如果我把: 我得到了正确的数据表,但是<代码>按排序、筛选和不起作用。 我得到:java。lang.NullPointerException这里是堆栈跟踪: 下面是代码的其余部分: 指数xhtml diomasBean.java 懒散的数据模型。JAVA IdiomasBo.java 习语