重新启用滚动后,水平RecyclerView不会向左滚动

时间:2019-02-27 04:34:19

标签: android android-recyclerview

重新启用滚动功能后,带有自定义查看器的recyclerview停止向左滚动。

基于业务逻辑,我禁用了滚动,但是当用户滑动到可配置的距离时,我启用了滚动(x上为100px)。如果用户执行LTR,滚动很好,但是如果完成RTL,则什么也不会发生。

recyclerview具有三个视图。 V1,V2和V3,但为了使recyclerview成为轮播,我在第一个索引处添加V3,在最后一个索引处添加V1,类似这样的V3, V1, V2, V3, V1。这样,当用户到达最后一个可见视图(V3)时,进一步滑动即可显示第一个视图(V1)

 list = listOf(scrollableData.last()) + scrollableData + listOf(
            scrollableData.first()
        )

以上逻辑在V1和V2上正常工作,但在V3上却不能正常工作,我认为这会导致向左滚动禁用。我可能错了。除了上面指定的内容以外,我正在做其他事情。

家庭活动

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
    }

CustomGestureDetector

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
}

希望我能提供足够的信息来理解我所面临的问题。

1 个答案:

答案 0 :(得分:0)

代替在recyclerview上实现逻辑。我创建了一个自定义RelativeLayout并在其中实现了逻辑,并将此布局用于每个项目。

    class CustomRelativeLayot: RelativeLayout{
        ...
        override fun onTouchEvent(motionEvent: MotionEvent): Boolean {
                when (motionEvent.action) {
                    MotionEvent.ACTION_DOWN -> {
pressedX = motionEvent.x
                disableScreenScroll()
                pressedTime = System.currentTimeMillis()
}
          }
        MotionEvent.ACTION_MOVE -> {
                    if (Math.abs(motionEvent.x - pressedX) > scrollSensitivity && isSwipable) {
    ...
                    }
                }
                MotionEvent.ACTION_UP -> {}
    }
    return true
    }

item.xml

<com...CustomRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/airModuleLayout"
    android:layout_width="match_parent"
    android:layout_height="@dimen/temp_height"
    android:orientation="vertical"
    app:isSwipable="true">
..
</com...CustomRelativeLayout>

我希望这可以帮助面临相同问题的其他人。