android 具有可滚动父视图的不可滚动RecyclerView

yrdbyhpb  于 2023-03-06  发布在  Android
关注(0)|答案(4)|浏览(266)

我的活动中有多个视图,包括2个垂直视图(1行)RecyclerViews。我使用setNestedScrollingEnabled(false)禁用了RecyclerViews上的滚动,只想使整个Activity可滚动。这没有按预期工作。触摸RecyclerViews之外的视图(我的AppBarLayout)触发了滚动,但只要我试图在其中一个RecyclerViews内滚动,它就不再工作了。我必须将触摸事件传递到我的主视图还是有其他解决方案?
我的布局如下所示(已剥离):

<android.support.design.widget.AppBarLayout>

    <android.support.design.widget.CollapsingToolbarLayout>

        <RelativeLayout>

            <ImageView>

            <LinearLayout>

                <TextView />

                <TextView />

            </LinearLayout>

        </RelativeLayout>

        <android.support.v7.widget.Toolbar />

    </android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

<LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1">

        <Button />

        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clipToPadding="false"
            android:scrollbars="none" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1">

        <Button />

        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clipToPadding="false"
            android:scrollbars="none" />

    </LinearLayout>
</LinearLayout>

编辑:刚刚添加了一张图片。触摸红色部分可以按预期滚动整个活动,但触摸蓝色部分不会滚动任何内容。

jxct1oxe

jxct1oxe1#

在嵌套滚动视图中使用回收视图

<android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

 <android.support.v7.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:nestedScrollingEnabled="false" />

 <android.support.v7.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:nestedScrollingEnabled="false" />

  </LinearLayout>

    </android.support.v4.widget.NestedScrollView>
2ekbmq32

2ekbmq322#

1.使用NestedScrollView作为ButtonRecyclerView布局的容器。
1.将app:layout_behavior="@string/appbar_scrolling_view_behavior"设置为NestedScrollView
1.使用CoordinatorLayout作为根布局。

尝试以下结构:

<android.support.design.widget.CoordinatorLayout>

<android.support.design.widget.AppBarLayout>
    <android.support.design.widget.CollapsingToolbarLayout>
        <RelativeLayout>
            <ImageView>
            <LinearLayout>
                <TextView />
                <TextView />
            </LinearLayout>
        </RelativeLayout>
        <android.support.v7.widget.Toolbar />
    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout>

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1">

            <Button />

            <android.support.v7.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:clipToPadding="false"
                android:scrollbars="none" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1">

            <Button />

            <android.support.v7.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:clipToPadding="false"
                android:scrollbars="none" />

        </LinearLayout>
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

</android.support.design.widget.CoordinatorLayout>

希望这个能有所帮助~

raogr8fs

raogr8fs3#

重写onInterceptTouchEvent方法并返回true。这将停止子级处理触摸事件。

@Override

public boolean onInterceptTouchEvent(MotionEvent ev)
{
    return true;
}
nkcskrwz

nkcskrwz4#

如果recyclerview被 Package 了,比如说被ConstraintLayout Package 了,那么它首先会被布局到一个固定的高度。一旦发生这种情况,它就会使用自己的机制在你滚动的时候循环行。如果你设置它不滚动,那么它就会这样做,并且保持循环行,所以你可能只会看到一些。
recyclerview需要放在一个容器中,这样它就有空间在没有任何约束的情况下进行扩展。例如,这个解决方案对我来说很有效,我把我的recyclerview Package 在约束布局中间的RelativeLayout中。
如果你只是复制一个解决方案,而不了解如何和为什么,那么你只是黑客。

<ScrollView...>
  <ConstraintLayout...>
   ...
               <RelativeLayout
                android:id="@+id/inventory_content"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@id/inventory_title">

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/my_recycler_view"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:nestedScrollingEnabled="false"
                    android:layout_alignParentStart="true"
                    android:layout_alignParentEnd="true"
                    android:layout_alignParentTop="true"
                    android:layout_alignParentBottom="true" />
            </RelativeLayout>
   ...
  </ConstraintLayout>

</ScrollView>

相关问题