第一个和最后一个项目的 SnapHelper 问题

GTI*_*TID 6 android android-recyclerview pagersnaphelper

我正在使用 Recyclerview 和 PageSnapHelper 创建图像轮播。

第一项 - 不居中在此处输入图片说明

第二项居中

第一个项目不居中,后续项目应该居中,我使用项目装饰器实现了这一点。RecyclerView 位于嵌套滚动视图中。

问题: 滚动不流畅,我覆盖了 findTargetSnapPosition,它在第一次滚动时滚动了 2 个项目。

 override fun findTargetSnapPosition(layoutManager: RecyclerView.LayoutManager, velocityX: Int, velocityY: Int): Int {

    if (layoutManager !is RecyclerView.SmoothScroller.ScrollVectorProvider) {
        return RecyclerView.NO_POSITION
    }

    val currentView = findSnapView(layoutManager) ?: return RecyclerView.NO_POSITION

    val layoutManager = layoutManager as LinearLayoutManager

    val position1 = layoutManager.findFirstVisibleItemPosition()
    val position2 = layoutManager.findLastVisibleItemPosition()

    var currentPosition = layoutManager.getPosition(currentView)



    if (velocityX > 500) {
        currentPosition = position2
    } else if (velocityX < 500) {
        currentPosition = position1
    }

    return if (currentPosition == RecyclerView.NO_POSITION) {
        RecyclerView.NO_POSITION
    } else currentPosition

}
Run Code Online (Sandbox Code Playgroud)

小智 1

如果我没猜错的话,您需要重写 LinearSnapHelper,因为您的项目视图不是全屏的。为了实现专注于第一个/最后一个项目,您需要重写 findSnapView 接下来的方式(请注意,此代码片段仅适用于 RecyclerView.layoutmanager 是 LinearLayoutManager 时):

fun RecyclerView.setLinearSnapHelper(isReversed: Boolean = false) {
  object : LinearSnapHelper() {

      override fun findSnapView(layoutManager: RecyclerView.LayoutManager?): View? {
          val firstVisiblePosition = (layoutManager as LinearLayoutManager).findFirstCompletelyVisibleItemPosition()
          val lastVisiblePosition = layoutManager.findLastCompletelyVisibleItemPosition()
          val firstItem = 0
          val lastItem = layoutManager.itemCount - 1
          return when {
              firstItem == firstVisiblePosition -> layoutManager.findViewByPosition(firstVisiblePosition)
              lastItem == lastVisiblePosition -> layoutManager.findViewByPosition(lastVisiblePosition)
              else -> super.findSnapView(layoutManager)
          }
      }
  }.apply { attachToRecyclerView(this@setLinearSnapHelper) }
}
Run Code Online (Sandbox Code Playgroud)