Jetpack Compose - LazyColumn、LazyRow、LazyVerticalGrid全面解析

1.介绍

LazyColumn

仅构成和放置当前可见项的垂直滚动列表,内容块定义了一个DSL,它允许您放置不同类型的子集内容。例如,您可以使用LazyListScope.item添加单个项目,使用LazyListScope.items添加项目列表。

LazyRow

仅构成和放置当前可见项的水平滚动列表,内容块定义了一个DSL,它允许您放置不同类型的子集内容。例如,您可以使用LazyListScope.item添加单个项目,使用LazyListScope.items添加项目列表。

LazyVerticalGrid

它只构成网格中可见的行。此API不稳定(未来可期),请考虑使用像LazyColumn和ROW这样的稳定组件来实现相同效果。

2.属性一览

@Composable
fun LazyColumn(
    modifier: Modifier = Modifier,
    state: LazyListState = rememberLazyListState(),
    contentPadding: PaddingValues = PaddingValues(0.dp),
    reverseLayout: Boolean = false,
    verticalArrangement: Arrangement.Vertical = if (!reverseLayout) Arrangement.Top else Arrangement.Bottom,
    horizontalAlignment: Alignment.Horizontal = Alignment.Start,
    flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
    content: LazyListScope.() -> Unit
): @Composable Unit

@Composable
fun LazyRow(
    modifier: Modifier = Modifier,
    state: LazyListState = rememberLazyListState(),
    contentPadding: PaddingValues = PaddingValues(0.dp),
    reverseLayout: Boolean = false,
    horizontalArrangement: Arrangement.Horizontal = if (!reverseLayout) Arrangement.Start else Arrangement.End,
    verticalAlignment: Alignment.Vertical = Alignment.Top,
    flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
    content: LazyListScope.() -> Unit
): @Composable Unit

@Composable
fun LazyVerticalGrid(
    cells: GridCells,
    modifier: Modifier = Modifier,
    state: LazyListState = rememberLazyListState(),
    contentPadding: PaddingValues = PaddingValues(0.dp),
    verticalArrangement: Arrangement.Vertical = Arrangement.Top,
    horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
    content: LazyGridScope.() -> Unit
)

参数含义
modifier: Modifier = Modifier布局修饰符
verticalArrangement: Arrangement.Vertical = Arrangement.Top子布局级的垂直放置方式,默认从Top到Bottom
horizontalAlignment: Alignment.Horizontal = Alignment.Start子布局级的垂直放置方式,默认从start开始
state: LazyListState = rememberLazyListState()用于控制或观察列表状态的状态对象
contentPadding: PaddingValues = PaddingValues(​0.​dp)子级内容边界距离LazyColumn、LazyRow的边界,
无法通过设置Modifier实现
reverseLayout: Boolean = false反转滚动和布局的方向,此时真正的项目将从下至上组成,
LazyListState.firstVisibleItemIndex==0 表示我们滚动到了底
FlingBehavior = ScrollableDefaults.​flingBehavior()接口来指定投掷行为。当拖动以scrollable中的velocity结束
时,将调用performFling以通过ScrollScope.scrollBy执行fling
动画和更新状态有兴趣的同学可以参考flinger
cells: GridCells描述单元格如何在垂直网格中形成列或在水平网格中形成
行, 对于垂直LazyVerticalGrid Fixed(3),这意味着有3列,
占父级宽度的1/3,Adaptive(val minSize: Dp)是每个单元格的minSize空间
content: BoxScope.() -> Unit子布局内容

Box中Modifier拓展函数

  • fun Modifier.weight( /@FloatRange(from = 0.0, fromInclusive = false)/ weight: Float, fill: Boolean = true ): Modifier Column 和 Row的权重分配函数,weight: Float 为比例,fill: Boolean = true 是否填充满下文使用实例会具体介绍
  • fun Modifier.align(alignment: Alignment.Vertical): Modifier 类似于设置layout_gravity,大多数控件都有的函数,不做过多介绍
  • fun Modifier.alignByBaseline(): Modifier 基于baseline对齐
  • fun Modifier.alignBy(alignmentLineBlock: (Measured) -> Int): Modifier
  • fun Modifier.alignBy(alignmentLine: HorizontalAlignmentLine): Modifier

3使用实例

LazyColumn使用

val itemsList = (0..5).toList()
val itemsIndexedList = listOf("A", "B", "C")
LazyColumn {
    items(itemsList) {
        Text("Item is $it")
    }

    item {
        Text("Single item")
    }

    itemsIndexed(itemsIndexedList) { index, item ->
        Text("Item at index $index is $item")
    }
}

image.png

LazyRow使用

val itemsList = (0..5).toList()
val itemsIndexedList = listOf("A", "B", "C")
LazyRow{
    items(itemsList) {
        Text("Item is $it")
    }

    item {
        Text("Single item")
    }

    itemsIndexed(itemsIndexedList) { index, item ->
        Text("Item at index $index is $item")
    }
}

image.png

LazyVerticalGrid使用

LazyVerticalGrid(cells = GridCells.Fixed(2),Modifier.background(Color.Red) ) {
    items(itemsList) {
        Text("Item is $it")
    }

    item {
        Text("Single item")
    }

    itemsIndexed(itemsIndexedList) { index, item ->
        Text("Item at index $index is $item")
    }
}

设置两列的VerticalGrid

image.png

LazyVerticalGrid(modifier = Modifier.width(250.dp)
    .background(Color.Yellow),
    cells = GridCells.Adaptive(60.dp) ) {
    items(itemsList) {
        Text("Item is $it",Modifier.background(Color.Green))
    }

    item {
        Text("Single item",Modifier.background(Color.Blue))
    }

    itemsIndexed(itemsIndexedList) { index, item ->
        Text("Item at index $index is $item",Modifier.background(Color.Cyan))
    }
}

设置总宽度Modifier.width(250.dp),每个item最小宽度为GridCells.Adaptive(60.dp),因此一行只能放下4个item,下一组item会继续沿着Vertical排列下去

image.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jetpack Compose 中,`LazyColumn` 可以使用 `remember` 函数来缓存数据以提高性能。如果数据源发生更改,`LazyColumn` 需要能够检测到这些更改并更新 UI。为此,可以使用 `key` 参数来告诉 `LazyColumn` 如何区分不同的数据项。 以下是一个示例,演示如何使用 `LazyColumn` 和 `remember` 函数来显示一个字符串列表,并在列表中添加或删除字符串时更新 UI: ```kotlin @Composable fun LazyColumnDemo() { // 用 remember 关键字缓存数据源,并使用 key 参数来区分不同的数据项 val items = remember { mutableStateListOf("Item 1", "Item 2", "Item 3") } LazyColumn { items(items.size, key = { index -> // 使用 index 和 item 的哈希值来区分不同的数据项 items[index].hashCode() }) { index -> Text(text = items[index]) // 添加一个按钮,用于在列表中添加新项目 Button(onClick = { items.add("New Item") }) { Text("Add Item") } // 添加一个按钮,用于从列表中删除项目 Button(onClick = { items.removeAt(index) }) { Text("Remove Item") } } } } ``` 在这个示例中,我们使用 `remember` 函数来缓存字符串列表。我们还使用 `key` 参数来告诉 `LazyColumn` 如何区分不同的数据项。在 `LazyColumn` 中迭代数据项时,我们可以使用 `index` 来访问每个项目,并使用 `items[index]` 来显示每个项目的文本。 我们还向 UI 添加了两个按钮,一个用于在列表中添加新项目,另一个用于从列表中删除项目。当我们单击这些按钮时,我们更新 `items` 列表,这将触发 `LazyColumn` 重新运行并更新 UI。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值