Jetpack Compose LazyColumn 的 ItemDecoration 是什么?

Ely*_*lye 6 android android-recyclerview item-decoration android-jetpack-compose android-jetpack-compose-list

在 JetpackCompose 中,我们可以使用LazyColumnForas RecyclerView

在 中RecyclerView,要在项目之间有适当的边距/填充,我们需要使用ItemDecoration,如本文所述

像下面

class MarginItemDecoration(private val spaceHeight: Int) : RecyclerView.ItemDecoration() {
    override fun getItemOffsets(outRect: Rect, view: View,
                                parent: RecyclerView, state: RecyclerView.State) {
        with(outRect) {
            if (parent.getChildAdapterPosition(view) == 0) {
                top = spaceHeight
            }
            left =  spaceHeight
            right = spaceHeight
            bottom = spaceHeight
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于 JetpackCompose LazyColumnFor,相当于ItemDecoration什么?

Gab*_*tti 10

有了1.0.x您可以使用Arrangement.spacedBy()添加项之间的间距。

就像是:

LazyColumn(
    verticalArrangement = Arrangement.spacedBy(8.dp),
) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

下面的示例8.dp在每个项目之间添加了空间

之前和之后:
在此处输入图片说明 在此处输入图片说明

如果要在内容边缘添加填充,可以使用该contentPadding参数。

  LazyColumn(
        verticalArrangement = Arrangement.spacedBy(8.dp),
        contentPadding = PaddingValues(horizontal = 24.dp, vertical = 8.dp)
  ){ ...  }
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,第一个项目将8.dp在其顶部添加填充,最后一个项目将添加8.dp到其底部,并且所有项目24.dp的左侧和右侧都有填充。

在此处输入图片说明


Noa*_*oah 6

您可以使用LazyColumnwith itemsIndexed(以前LazyColumnForIndexed已弃用)并根据索引应用填充。

LazyColumn {
  itemsIndexed(items = ...) { index, item ->
    Box(Modifier.padding(
      start = 16.dp, end = 16.dp, bottom = 16.dp, top = if (index == 0) 16.dp else 0.dp
    ))
  }
}
Run Code Online (Sandbox Code Playgroud)


Ely*_*lye 0

我的解决方法是使用contentPaddingLazyColumnFor顶部、开始和结束填充,以及Spacer所有项目的底部填充。

@Composable
fun MyComposeList(
    modifier: Modifier = Modifier,
    listItems: List<String>,
) {
    LazyColumnFor(
        modifier = modifier, items = listItems,
        contentPadding = PaddingValues(16.dp, 16.dp, 16.dp)
    ) { itemText ->
        ViewItem(
            itemText = itemText
        )
        Spacer(modifier = Modifier.fillMaxWidth().height(16.dp))
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎得到了我需要的结果,因为contentPadding可以在LazyColumnFor