【问题标题】:SnapHelper issue with first and Last item第一项和最后一项的 SnapHelper 问题
【发布时间】:2019-03-25 10:05:36
【问题描述】:

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

First item - Not Centered

第一个项目不居中,后续项目应该居中,我使用项目装饰器实现了这一点。 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

}

【问题讨论】:

    标签: android android-recyclerview pagersnaphelper


    【解决方案1】:

    如果我说得对,您需要改写 LinearSnapHelper,因为您的项目视图没有全屏显示。为了实现对第一个/最后一个项目的关注,您需要在下一个方式覆盖 findSnapView(请注意,此 sn-p 仅在 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) }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-12
      • 2017-02-17
      • 2023-03-16
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      相关资源
      最近更新 更多