gpt4 book ai didi

android - 使用 LinearSnapHelper 的 Recyclerview - 从屏幕上松开手指时捕捉到下一个项目

转载 作者:行者123 更新时间:2023-11-30 00:06:17 26 4
gpt4 key购买 nike

我关注了this Stack Overflow post创建具有 viewpager 行为的 recyclerview。

工作正常,但我需要在用户抬起屏幕手指时触发滚动到下一个项目。现在仅在 50% 可见时捕捉到下一个项目。

更新解决方案

Crysxd 响应是关键。为了检测对齐方向,我在 findTargetSnapPosition 函数的顶部添加了这段代码:

if (velocityY < 0)
snapToPrevious = true
else
snapToNext = true

最佳答案

没有办法绕过自定义 SnapHelper。这是您可以复制到项目中的类。

解决方案

class ControllableSnapHelper(val onSnapped: ((Int) -> Unit)? = null) : LinearSnapHelper() {
var snappedPosition = 0
private var snapToNext = false
private var snapToPrevious = false
var recyclerView: RecyclerView? = null

override fun attachToRecyclerView(recyclerView: RecyclerView?) {
super.attachToRecyclerView(recyclerView)
this.recyclerView = recyclerView
}

override fun findTargetSnapPosition(layoutManager: RecyclerView.LayoutManager, velocityX: Int, velocityY: Int): Int {
if (snapToNext) {
snapToNext = false
snappedPosition = Math.min(recyclerView?.adapter?.itemCount ?: 0, snappedPosition + 1)
} else if (snapToPrevious) {
snapToPrevious = false
snappedPosition = Math.max(0, snappedPosition - 1)
} else {
snappedPosition = super.findTargetSnapPosition(layoutManager, velocityX, velocityY)
}

onSnapped?.invoke(snappedPosition)
return snappedPosition
}

fun snapToNext() {
snapToNext = true
onFling(Int.MAX_VALUE, Int.MAX_VALUE)
}

fun snapToPrevious() {
snapToPrevious = true
onFling(Int.MAX_VALUE, Int.MAX_VALUE)
}
}

您也可以将 LinearSnapHelper 替换为 PagerSnapHelper。只需调用 snapToNext()snapToPrevious()。我还实现了一个在构造函数中传递的回调。

工作原理

我们只是重写了 findTargetSnapPosition(...) 方法。此方法可以返回任何位置,然后 SnapHelper 实现将计算滚动动画以到达该位置。函数 snapToNext()snapToPrevious() 只是设置一个 bool 值,告诉我们下一次 findTargetSnapPosition(...) 捕捉到下一个或上一个 View 被调用。添加一个 snapTo(index: Int) 函数也非常简单。设置 bool 值后,我们需要开始捕捉进度。为此,我们调用了 onFling(...),它会在用户移动 RecyclerView 时调用。我们需要传入一个超过 SnapHelper 设置的最小速度的值,所以我们只使用 Int.MAX_VALUE。由于我们从不调用 super.findTargetSnapPosition(...),因此 PagerSnapHelper 使用的实际速度并不重要。

关于android - 使用 LinearSnapHelper 的 Recyclerview - 从屏幕上松开手指时捕捉到下一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48943943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com