RecyclerView PagerSnapHelper Snap on Start/Top 而不是中心 Android
RecyclerView PagerSnapHelper Snap on Start/Top instead of center Android
我正在使用垂直回收器视图并附加了一个 pagerSnapHelper.it 工作正常并将项目捕捉到中心位置但我希望它捕捉到开始(顶部)。我不想使用 linearSnapHelper,因为它无法按我想要的方式工作。 GravitySnapHelper 也不会在扩展时工作 linearSnapHelper.if 你可以与 PagerSnapHelper 扩展共享一个类似的 class 它会很棒
所以我通过使用 LinearSnapHelper 实现了一个可行的解决方案。使用库捕捉到顶部
图书馆 - https://github.com/rubensousa/GravitySnapHelper
为了实现类似于 pager snap helper 的滚动,我使用了下面的代码
// remember to initialize snaphelper
snapHelper = object : GravitySnapHelper(Gravity.TOP){
override fun findTargetSnapPosition(
layoutManager: RecyclerView.LayoutManager,
velocityX: Int,
velocityY: Int
): Int {
val centerView = findSnapView(layoutManager) ?: return RecyclerView.NO_POSITION
val position = layoutManager.getPosition(centerView)
var targetPosition = -1
if (layoutManager.canScrollHorizontally()) {
targetPosition = if (velocityX < 0) {
position - 1
} else {
position + 1
}
}
if (layoutManager.canScrollVertically()) {
// Log.d("debug", "velocityY $velocityY")
targetPosition = if (velocityY < 0) {
position - 1
} else {
position + 1
}
}
val firstItem = 0
val lastItem = layoutManager.itemCount - 1
targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem))
return targetPosition
}
}
// lower the value higher the speed of scroll
// default is 100f
snapHelper.scrollMsPerInch = 40f
snapHelper.attachToRecyclerView(binding?.yourRecyclerView)
我正在使用垂直回收器视图并附加了一个 pagerSnapHelper.it 工作正常并将项目捕捉到中心位置但我希望它捕捉到开始(顶部)。我不想使用 linearSnapHelper,因为它无法按我想要的方式工作。 GravitySnapHelper 也不会在扩展时工作 linearSnapHelper.if 你可以与 PagerSnapHelper 扩展共享一个类似的 class 它会很棒
所以我通过使用 LinearSnapHelper 实现了一个可行的解决方案。使用库捕捉到顶部
图书馆 - https://github.com/rubensousa/GravitySnapHelper
为了实现类似于 pager snap helper 的滚动,我使用了下面的代码
// remember to initialize snaphelper
snapHelper = object : GravitySnapHelper(Gravity.TOP){
override fun findTargetSnapPosition(
layoutManager: RecyclerView.LayoutManager,
velocityX: Int,
velocityY: Int
): Int {
val centerView = findSnapView(layoutManager) ?: return RecyclerView.NO_POSITION
val position = layoutManager.getPosition(centerView)
var targetPosition = -1
if (layoutManager.canScrollHorizontally()) {
targetPosition = if (velocityX < 0) {
position - 1
} else {
position + 1
}
}
if (layoutManager.canScrollVertically()) {
// Log.d("debug", "velocityY $velocityY")
targetPosition = if (velocityY < 0) {
position - 1
} else {
position + 1
}
}
val firstItem = 0
val lastItem = layoutManager.itemCount - 1
targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem))
return targetPosition
}
}
// lower the value higher the speed of scroll
// default is 100f
snapHelper.scrollMsPerInch = 40f
snapHelper.attachToRecyclerView(binding?.yourRecyclerView)