SnapHelper проблема с первым и последним элементом
Я использую 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
}
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) }
}