android RecyclerView(水平)嵌套在BottomSheet中,防止垂直滚动

nnsrf1az  于 2023-03-27  发布在  Android
关注(0)|答案(2)|浏览(250)

我有一个RecyclerView,它使用LinearLayoutManagerHORIZONTAL方向,嵌套在使用BottomSheetBehaviorFrameLayout中。
当尝试垂直拖动RecyclerView时,BottomSheet不响应拖动事件。推测这是因为水平方向的LayoutManager禁用了垂直滚动。
我试过重写LinearLayoutManager.canScrollVertically()并返回true。这 *sort * 工作..如果你非常小心地垂直拖动,BottomSheet会响应。但是,一旦涉及任何水平移动,BottomSheet就停止响应垂直拖动事件。
我不确定覆盖canScrollVertically()是否是正确的方法--从用户体验的Angular 来看,这肯定是不正确的。
我还注意到,如果我使用ViewPager而不是RecyclerView和水平方向的LayoutManagerBottomSheet会根据需要响应垂直滑动事件。
是否有其他LayoutManagerRecyclerViewBottomSheet Behavior或其他方法可以帮助将垂直滚动事件传播到BottomSheet Behavior上?
这里有一个问题的例子:
https://github.com/timusus/bottomsheet-test(问题可以通过提交#f59a7031重现)
展开第一个底页。

gcmastyq

gcmastyq1#

问题出在哪里呢?在FrameLayout中。当BottomSheet放在CoordinatorLayout中时,BottomSheet可以完美地工作。然后BottomSheet可以通过CoordinatorLayout将其滚动状态传递给作为CoordinatorLayout直接子级的其他视图。
为什么RecyclerView不能将滚动状态传递给BottomSheet?它不是CoordinatorLayout的直接子节点。但是有一种方法可以传递它们:RecyclerView必须在实现NestedScrollingParentNestedScrollingChild的视图中。答案是:NestedScrollView
因此,您的fragment_sheetX.xml布局应该如下所示:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff"
    android:orientation="vertical"
    android:fillViewport="true">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

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

另外请注意android:fillViewport="true",否则,您的RecyclerView将不会占用整个高度。
但是它仍然不起作用。为什么?RecyclerView必须被告知将垂直滚动传递给父级。如何?答案是recyclerView.setNestedScrollingEnabled(false);,但更好地描述了here
顺便说一句:MultiSheetView是一个很棒的特性,也是一个非常有趣的移动的用户体验设计方法。

imzjd6km

imzjd6km2#

android:nestedScrollingEnabled="false"

在recyclerview中设置此选项解决了问题

相关问题