在子Recyclerview android中禁用滚动

我的布局包含一个带有子Recyclerview的Parent RecyclerView

我知道将列表放在另一个列表中并不好,但我必须这样才能使用子列表function,如滑动和拖放

我的问题是,孩子Recyclerview获得焦点并停止父母滚动,如果触摸点在它上面只是我想如果触摸垂直在孩子上Recyclerview父母上下滚动,如果触摸是水平或点击然后子Recyclerview列表项左右滑动。 有没有帮助实现这一目标?

  • 使用带有StaggeredGridLayoutManager的RecyclerView时,如何避免项目之间的双重空间?
  • 获得点击项目及其在RecyclerView中的位置
  • 我想我的RecyclerView不回收一些项目
  • Android - 如何在滚动时停止RecyclerView中的图像重新加载
  • dynamic地将RecyclerView中的视图添加到当前项目
  • RecyclerView可扩展cardView
  • 在屏幕上显示特定百分比时,在回收站视图中暂停video
  • 将空间添加到RecyclerView的末尾
  • 我终于find了解决方案。

    创建自定义LinearLayoutManager

    public class CustomLinearLayoutManager extends LinearLayoutManager { public CustomLinearLayoutManager(Context context, int orientation, boolean reverseLayout) { super(context, orientation, reverseLayout); } // it will always pass false to RecyclerView when calling "canScrollVertically()" method. @Override public boolean canScrollVertically() { return false; } } 

    然后像这样实例化它以进行垂直滚动

     CustomLinearLayoutManager customLayoutManager = new CustomLinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false); 

    最后将自定义布局设置为回收器视图的布局管理器

     recyclerView.setLayoutManager(customLayoutManager); 

    虽然嵌入式回收站视图可能不是一个好习惯,但有时您无法避免。 这样的事情可能有用:

     public class NoScrollRecycler extends RecyclerView { public NoScrollRecycler(Context context){ super(context); } public NoScrollRecycler(Context context, AttributeSet attrs){ super(context, attrs); } public NoScrollRecycler(Context context, AttributeSet attrs, int style){ super(context, attrs, style); } @Override public boolean dispatchTouchEvent(MotionEvent ev){ //Ignore scroll events. if(ev.getAction() == MotionEvent.ACTION_MOVE) return true; //Dispatch event for non-scroll actions, namely clicks! return super.dispatchTouchEvent(ev); } } 

    这将禁用滚动事件,但不会禁用单击事件。 将此类用于“child”RecyclerView。 您希望PARENT recyclerview能够滚动,而不是孩子。 那么这应该这样做,因为父母将只是标准的RecyclerView,但是孩子将是这个自定义的没有滚动,但处理点击。 可能需要禁用单击父级RecyclerView ..不确定,因为我没有测试过这个,所以请考虑它只是一个例子……

    另外,要在XML中使用它(如果您不知道),请执行以下操作:

      ... ...  

    在您的ActivityName.java上,在onCreate()方法内写:

     RecyclerView v = (RecyclerView) findViewById(R.id.your_recycler_view_id); v.setNestedScrollingEnabled(false); 

    无论如何,如果您使用协调器布局,如果您想简化事情,并且您想要禁用嵌套滚动。

         

    再次,您应用相同的原则:在您的ActivityName.java上,在onCreate()方法内写:

     RecyclerView v = (RecyclerView) findViewById(R.id.your_recycler_view_id); v.setNestedScrollingEnabled(false); 

    所以基本上在XML中,你必须指定app:layout_behavior

     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    子级RecyclerView中的android:nestedScrollingEnabled="false"

    你可以加

     android:nestedScrollingEnabled="false" 

    到您的RecyclerView XML或

     childRecyclerView.setNestedScrollingEnabled(false); 

    到您的RecyclerView in Java。

    编辑:-

    childRecyclerView.setNestedScrollingEnabled(false); 仅适用于android_version> 21台设备。 要在所有设备上工作,请使用以下命令

     ViewCompat.setNestedScrollingEnabled(childRecyclerView, false); 

    你可以使用setNestedScrollingEnabled(false); 在子回收器视图上停止在子回收器视图内滚动。 在我的情况下代码是

    mInnerRecyclerView.setNestedScrollingEnabled(假); 其中mInnerRecyclerView是内部的recyclerview

    我尝试了许多建议的解决方案,找不到一个适用于我的情况。 我使用GridLayoutManager在ScrollView中有超过1个RecyclerView。 上面建议的结果导致ScrollView在我抬起手指时停止滚动(当我的手指被提升到RecyclerView上时,它没有滑到视图的顶部或底部)

    查看RecyclerView源代码,在onTouchEvent内部调用布局管理器:

     final boolean canScrollHorizontally = mLayout.canScrollHorizontally(); final boolean canScrollVertically = mLayout.canScrollVertically(); 

    如果在自定义布局管理器中覆盖这些,则返回false并停止滚动。 它还修复了ScrollView突然停止滚动的问题。

    如果您不想创建自定义视图,另一个选项是在RecyclerView前面创建相同大小的布局,并使其可单击。

    编辑:但不幸的是它也阻止了列表项的事件。