具有SnapHelper装饰的RecyclerView

时间:2020-03-16 11:08:23

标签: android android-recyclerview

我遇到一种情况,当我使用SnapHelper将照片库实现为RecyclerView时。一些照片(全屏照片)被“粘合”在一起。我想为其添加一些装饰,以使它们在项目之间留有空白,但仅当一个人开始焦化时,否则我希望照片占据整个宽度。我尝试过:

创建自定义装饰后,我设法将装饰可绘制对象从屏幕上绘制出来,使其只能在滚动时显示,但是当覆盖onDraw()时它是不可见的-隐藏在下一张照片下,并且当我覆盖{{ 1}}下一张照片的边缘在分隔线下。我当时在为照片添加填充,然后在回收站的空闲状态下将其重置,但随后照片跳了一点。

我还考虑在每张照片之间添加“虚拟”物品,就像分隔线一样,并迫使回收站每次滚动两个位置,但是似乎有更好的解决方案。

1 个答案:

答案 0 :(得分:0)

使用ItemDecoration,您处在正确的轨道上,但是您应该覆盖的方法是getItemOffsets()而不是onDraw / onDrawOver。它可以让您在商品周围添加空间。

class LinearHorizontalSpacingDecoration(@Px private val innerSpacing: Int) :
    RecyclerView.ItemDecoration() {

    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State
    ) {
        super.getItemOffsets(outRect, view, parent, state)

        val itemPosition = parent.getChildAdapterPosition(view)

        outRect.left = if (itemPosition == 0) 0 else innerSpacing / 2
        outRect.right = if (itemPosition == state.itemCount - 1) 0 else innerSpacing / 2
    }
}

间距为16dp的结果:

Transition with a fixed spacing

如果您需要更多详细信息(例如:如何实现缩放效果),我已经写了Medium post,描述了使用RecyclerView和SnapHelper逐步实现这种轮播的实现。