我的布局包含一个带有子Recyclerview的Parent RecyclerView
我知道将列表放在另一个列表中并不好,但我必须这样才能使用子列表功能,如滑动和拖放
我的问题是,如果触摸点在其上,则子级Recyclerview会获得焦点并阻止父级滚动 我只想要在孩子的Recyclerview上垂直触摸 父母上下滚动,如果触摸是水平或点击,则子Recyclerview列表项左右滑动。 有任何帮助实现这一目标吗?
答案 0 :(得分:39)
我终于找到了解决方案。
创建自定义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);
答案 1 :(得分:15)
虽然嵌入式回收站视图可能不是一个好习惯,但有时您无法避免。这样的事情可能有用:
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);
}
}
这将禁用滚动事件,但不会禁用点击事件。将此课程用于"孩子" RecyclerView。您希望PARENT recyclerview能够滚动,而不是孩子。那么这应该这样做,因为父母将只是标准的RecyclerView,但孩子将是这个自定义的没有滚动,但处理点击。可能需要禁用点击父级RecyclerView ..不确定,因为我没有测试过这个,所以请考虑它只是一个例子......
另外,要在XML中使用它(如果您不知道),请执行以下操作:
<com.yourpackage.location.NoScrollRecycler
...
... >
...
...
</com.yourpackage.location.NoScrollRecycler>
答案 2 :(得分:14)
在您的ActivityName.java上,在onCreate()方法内写:
RecyclerView v = (RecyclerView) findViewById(R.id.your_recycler_view_id);
v.setNestedScrollingEnabled(false);
无论如何,如果您正在使用协调器布局,如果您想简化操作,并且想要禁用嵌套滚动。
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="@+id/activitiesListRV"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</android.support.v4.widget.NestedScrollView>
你再次采用同样的原则: 在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">
答案 3 :(得分:10)
android:nestedScrollingEnabled="false"
您可以添加
android:nestedScrollingEnabled="false"
到您的RecyclerView XML或
childRecyclerView.setNestedScrollingEnabled(false);
到您的RecyclerView in Java。
修改: - 强>
childRecyclerView.setNestedScrollingEnabled(false);
仅适用于android_version&gt; 21个设备。要在所有设备上工作,请使用以下
ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);
答案 4 :(得分:2)
您可以在子setNestedScrollingEnabled(false);
上使用RecyclerView
停止在子RecyclerView
内滚动。
在我的情况下代码是
mInnerRecyclerView.setNestedScrollingEnabled(false);
其中mInnerRecyclerView
是内部RecyclerView
。
答案 5 :(得分:1)
我尝试了许多建议的解决方案,但找不到适用于我案例的解决方案。我使用GridLayoutManager在ScrollView中有超过1个RecyclerView。上述建议的结果导致ScrollView在我抬起手指时停止滚动(当我的手指被提升到RecyclerView上时,它没有滑到视图的顶部或底部)
查看RecyclerView源代码,在onTouchEvent内部调用布局管理器:
final boolean canScrollHorizontally = mLayout.canScrollHorizontally();
final boolean canScrollVertically = mLayout.canScrollVertically();
如果在自定义布局管理器中覆盖这些,则返回false并停止滚动。它还解决了ScrollView突然停止滚动的问题。
答案 6 :(得分:0)
如果您不想制作自定义视图,另一个选项是在RecyclerView前面创建相同大小的布局,并使其可以点击。
编辑: 但不幸的是,它也会阻止列表项的事件。
答案 7 :(得分:0)
我想为时已晚,但在这里我仍然找到了解决方案,如果它仍然困扰着某人:
RecyclerView v = (RecyclerView);
findViewById(R.id.your_recycler_view_id);
v.setNestedScrollingEnabled(false);
sensorsRecyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
答案 8 :(得分:0)
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_marginTop="2dp"
android:layout_marginLeft="2dp"
android:layout_marginBottom="10dp"
android:layout_marginRight="2dp"
android:nestedScrollingEnabled="false"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
将代码放入衬板布局中...无需实际进行任何操作