【问题标题】:RecyclerView with SnapHelper decoration带有 SnapHelper 装饰的 RecyclerView
【发布时间】:2020-03-16 11:08:23
【问题描述】:

我有一个使用 SnapHelper 将照片库实现为 RecyclerView 的案例。一些照片(那些占据全屏宽度的照片)被“粘合”在一起。我想给它添加一些装饰,以便在项目之间留出空白,但只有当一个开始滚动时,否则我希望照片占据整个宽度。我试过了:

创建自定义装饰,我已经设法将我的装饰从屏幕上绘制出来,因此它只会在滚动时显示,但是当覆盖 onDraw() 时它是不可见的 - 隐藏在下一张照片下,当我覆盖 onDrawOver() 时下一张照片的边缘在分隔线下。我正在为照片添加填充,并在回收器的空闲状态下将其重置,但随后照片有点跳跃。

我还考虑在每张照片之间添加“虚拟”项目,就像分隔线一样,并强制回收器每次滚动两个位置,但似乎可能有更好的解决方案。

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    您在使用 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 的结果:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-06
      • 2014-07-21
      • 2016-04-17
      • 1970-01-01
      • 2021-08-26
      • 2012-12-23
      • 2014-02-16
      • 1970-01-01
      相关资源
      最近更新 更多