【问题标题】: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 逐步实现这种轮播。