在子Recyclerview android中禁用滚动

时间:2015-05-13 18:10:17

标签: android android-listview android-recyclerview

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

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

我的问题是,如果触摸点在其上,则子级Recyclerview会获得焦点并阻止父级滚动 我只想要在孩子的Recyclerview上垂直触摸 父母上下滚动,如果触摸是水平或点击,则子Recyclerview列表项左右滑动。 有任何帮助实现这一目标吗?

9 个答案:

答案 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)

孩子RecyclerView

中的

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>

将代码放入衬板布局中...无需实际进行任何操作