【问题标题】:How to disable fragment scroll in horizontal recyclerview如何在水平回收器视图中禁用片段滚动
【发布时间】:2020-12-28 06:48:56
【问题描述】:

我有一个水平的 recyclerView,我用 imageViews 填充,这样当用户从右向左滑动时,其余的图像就会一张一张地出现。一切正常,图像已加载,水平滚动按预期工作,甚至个别项目的 clickListener 工作正常......

但是...如果向右滚动的触摸手势不是纯水平滑动(或者如果用户到达 recyclerView 的末尾并想要向左滚动返回),正在加载 recyclerView 的片段也向下滚动。我想避免这种行为,这样当用户打算到达从右向左滑动的图像时,recyclerView 只会在水平方向移动,而忽略在 recyclerView 上执行的任何垂直移动。如果用户在 recyclerView 屏幕区域之外点击或滑动,我希望发生通常的行为(按预期向下滚动)。我已尝试使用此站点中的其他替代方法,例如使用 setOnTouchListener 选项来检测 MotionEvent 并采取相应措施,您可以在下面查看(这是我的片段中的实际代码):

advertPicturesRecyclerView.setOnTouchListener { recyclerView, motionEvent ->
        when(motionEvent.action) {
            MotionEvent.ACTION_UP -> {
                Snackbar.make(recyclerView, "Touch down!", Snackbar.LENGTH_LONG).show()
                recyclerView.parent.requestDisallowInterceptTouchEvent(true)
                true
            }
            else -> {
                recyclerView.parent.requestDisallowInterceptTouchEvent(false)
                true
            }
        }
    }

在这种情况下,ACTION_UP 表示在 recyclerView 的方向上,所以这只是检测 recyclerView 内部的移动,并将垂直移动“传递”到向下滚动的父级(片段)。

如何“阻止”recyclerView 以忽略任何垂直滑动,而只水平移动?

【问题讨论】:

    标签: android android-studio kotlin android-fragments android-recyclerview


    【解决方案1】:
    val viewManager = LinearLayoutManager(requireContext(),LinearLayoutManager.HORIZONTAL, false)
    myRecylcerView?.layoutManager = viewManager
    

    根据您的问题,上述 sn-p 仅允许水平滚动,但我猜还有其他原因导致问题,例如您可能正在使用 NestedScrollView/ScrollView,因此请提供布局文件和示例视频对问题有清晰的认识。

    更新 - 2020 年 9 月 25 日

    你可以试试下面的 NestedScrollView 和 recyclerview

    <androidx.core.widget.NestedScrollView
        android:id="@+id/nsvMain"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollMode="never">
        // .....
        // .....
    
    </androidx.core.widget.NestedScrollView
    
    myRecylcerView?.isNestedScrollingEnabled = false
    

    如果你附上你的布局文件会更好。

    【讨论】:

    • 感谢您的回复,Harsh Rajgor。你是对的,问题来自作为布局一部分的 NestedScrollView。 RecyclerView 在 NestedScrollView 内部,当我将它放在 NestedScrollLayout 之外时,它按预期工作,但现在它总是需要一个固定的屏幕空间来显示 RecyclerView,这出于设计原因是不可取的。是否可以仅在 RecyclerView 上禁用 NestedScrollView 的滚动? (即,我希望 NestedScrollView 在水平 RecyclerView 上执行向下滑动时忽略向下滑动)
    • @Franbede,我已经更新了答案,如果更新的解决方案无法解决您的问题,请附上布局文件。
    猜你喜欢
    • 2018-05-08
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多