我遇到一种情况,当我使用SnapHelper将照片库实现为RecyclerView时。一些照片(全屏照片)被“粘合”在一起。我想为其添加一些装饰,以使它们在项目之间留有空白,但仅当一个人开始焦化时,否则我希望照片占据整个宽度。我尝试过:
创建自定义装饰后,我设法将装饰可绘制对象从屏幕上绘制出来,使其只能在滚动时显示,但是当覆盖onDraw()
时它是不可见的-隐藏在下一张照片下,并且当我覆盖{{ 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的结果:
如果您需要更多详细信息(例如:如何实现缩放效果),我已经写了Medium post,描述了使用RecyclerView和SnapHelper逐步实现这种轮播的实现。