在子Recyclerview android中禁用滚动

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

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

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

Related of "在子Recyclerview android中禁用滚动"

我终于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前面创建相同大小的布局,并使其可单击。

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