6

I am using Recyclerview with PageSnapHelper to create an Image carousel.

First item - Not Centeredenter image description here

Second Item Centered

The first Item is not centered and Subsequent Items should be centered, I have achieved this using item decorator. RecyclerView is inside nested scrollview.

Issue: Scrolling is not smooth, I have override findTargetSnapPosition, It is scrolling 2 items for the first fling.

 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

}
Tanveer Munir
  • 1,956
  • 1
  • 12
  • 27
GTID
  • 538
  • 2
  • 6
  • 19

1 Answers1

1

If i got you right, you need to override LinearSnapHelper instead, cause your item views are not full screened. For achieving focusing on first/last items you need to override findSnapView next way(note that this snippet only applicable when RecyclerView.layoutmanager is 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) }
}
rominator007
  • 1,553
  • 1
  • 11
  • 22
Bohdan
  • 26
  • 1
  • 4