目前在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
中显示非滚动网格是否有任何解决方法?
对我来说,我添加了高度明确性,它对我在懒人柱内的LazyverticalGrid起到了很好的作用
LazyVerticalGrid(
cells = GridCells.Fixed(3),
contentPadding = PaddingValues(5.dp),
modifier = Modifier
.layoutId("lazy_list")
.height(200.dp)
这个公认的答案很棒,在数据列表很小、网格项目的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 */
}
}
如果您不介意使用不稳定的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 习语