RecyclerView ItemDecoration与RecyclerView项之间的间距Margin



在我的目录中我有recyclerviews我想让recyclerview条目之间有空格,所以这里我有两个选项

  1. 我可以子类RecyclerView.ItemDecoration
  2. 我可以将margin添加到项目本身

显然,第二个选项是简单的一个,使用该选项,我得到了所需的结果,但在网上,我看到人们使用ItemDecoration,也推荐它。

我想知道使用ItemDecoration是否有一些优势,即使我的用例非常简单,如在项目之间添加间距?
ItemDecoration是否提供性能优势或其他优势?

使用ItemDecoration:

  1. 易于实现,只需recyclerView.addItemDecoration(DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL))

  2. 这是自然的,它只增加项目之间的差距,这意味着你不会看到它在第一项的顶部,或最后一项的底部。

  3. 您可以自定义分隔符,通过以下命令:

    val dividerDrawable = getDrawable(context, R.drawable.divider)
    itemDecoration.setDrawable(dividerDrawable)
    

UsingMarginon Item View Layout:

  1. 也很容易实现,但它有一些明显的缺点:它将出现在第一个项目的顶部和最后一个项目的底部。除非你编写更多的代码(逻辑)来处理它。

您在各种资源中读到的内容确实是正确的。使用ItemDecoration更加干净代码为可重用在某种意义上。

这消除了我们在UI中为item_layout手动调整页边距的需要,即使如此,最上面和最下面的项目也包含页边距问题。

使用ItemDecoration,我们可以创建一个单独的类(见下面的例子)来添加偏移量。(

),它会自动在RecyclerView项之间添加所需的间距:
class MarginItemDecoration(private val spaceSize: Int) : RecyclerView.ItemDecoration() {
override fun getItemOffsets(
outRect: Rect, view: View,
parent: RecyclerView, 
state: RecyclerView.State
) {
with(outRect) {
if (parent.getChildAdapterPosition(view) == 0) {
top = spaceSize
}
left = spaceSize
right = spaceSize
bottom = spaceSize
}
}
}

感谢@cmorigaki提供了上面的例子。

最新更新