【发布时间】:2019-05-22 08:15:31
【问题描述】:
当重新启用滚动时,带有自定义视图的 recyclerview 停止向左滚动。
根据业务逻辑,我禁用了滚动,但是当用户滑动到可配置的距离时,我启用了滚动(x 上为 100 像素)。如果用户执行 LTR,则滚动很好,但如果 RTL 完成,则不会发生任何事情。
recyclerview 有三个视图。 V1、V2 和 V3,但为了使回收视图成为轮播,我在第一个索引处添加 V3,在最后一个索引处添加 V1,类似于 V3, V1, V2, V3, V1。这样,当用户到达最后一个可见视图(V3)时,进一步滑动会显示第一个视图(V1)
list = listOf(scrollableData.last()) + scrollableData + listOf(
scrollableData.first()
)
上述逻辑适用于 V1 和 V2,但不适用于 V3,我认为这会导致向左滚动禁用。我可能错了。除了我上面指定的之外,我正在做任何其他事情。
HomeActivity
gestureDetector = GestureDetector(this@HomeActivity, object : CustomGestureDetector(recycler_view) {
override fun move(): Boolean {
enableScroll()
return false
}
override fun down(): Boolean {
disableScroll()
return false
}
})
recycler_view.setOnTouchListener { v, event ->
if (event != null) {
gestureDetector.onTouchEvent(event)
}
false
}
override fun enableScroll() {
linearLayoutManager.isScrollEnabled = true
}
override fun disableScroll() {
linearLayoutManager.isScrollEnabled = false
}
自定义手势检测器
public abstract class CustomGestureDetector(view: View) : GestureDetector.SimpleOnGestureListener() {
var view = view
override fun onDown(e: MotionEvent?): Boolean {
view.onTouchEvent(e)
down()
return false
}
override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
if (Math.abs(e2.x - e1.x) > 500) {
move()
}
return false
}
abstract fun move(): Boolean
abstract fun down(): Boolean
}
我希望我已经提供了足够的信息来理解我所面临的问题。
【问题讨论】:
-
在您的 onFling 函数中,我认为 if 条件只能在一个方向上起作用,您必须向其中添加第二个条件。
-
@UmarHussain 不,它是双向的,
Math.abs(..)使结果值为正。我已经检查过了。谢谢。
标签: android android-recyclerview