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

问题描述 投票:0回答:2

我有一个

RecyclerView
,使用带有
LinearLayoutManager
方向的
HORIZONTAL
,使用
FrameLayout
BottomSheet
嵌套在
Behavior
内。

当尝试垂直拖动

RecyclerView
时,
BottomSheet
不响应拖动事件。大概这是因为水平方向的
LayoutManager
禁用了垂直滚动。

我试过重写

LinearLayoutManager.canScrollVertically()
并返回 true。这有点的作用..如果你以非常小心的方式垂直拖动,
BottomSheet
会响应。但是,一旦涉及任何水平运动,
BottomSheet
就会停止响应垂直拖动事件。

我不确定在这里覆盖

canScrollVertically()
是否是正确的方法——从用户体验的角度来看,它肯定感觉不对。

我还注意到,如果我使用

ViewPager
而不是具有水平方向的
RecyclerView
LayoutManager
BottomSheet
会根据需要响应垂直滑动事件。

是否有其他方法可以帮助将垂直滚动事件传播到

LayoutManager

这里有一个问题的例子:

https://github.com/timusus/bottomsheet-test
(问题可以通过提交 #f59a7031 重现)

只需展开第一个底页。

问题出在哪里?在

RecyclerView

BottomSheet Behavior
android android-recyclerview androiddesignsupport bottom-sheet
2个回答
41
投票
BottomSheet Behavior

时效果很好。然后

FrameLayout
可以通过
BottomSheet
将它的滚动状态传递给作为
CoordinatorLayout
的直接子级的其他视图。

为什么
BottomSheet
无法将滚动状态传递给
CoordinatorLayout
?它不是

CoordinatorLayout

的直系子代。但是有一种方法可以通过它们:

RecyclerView
必须考虑到实现
BottomSheet
CoordinatorLayout
。答案是:
RecyclerView


所以你的NestedScrollingParent
布局应该是这样的:
NestedScrollingChild

还要注意

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"
,但在

here

.

中描述得更好

顺便说一句:
RecyclerView
是一个很棒的功能,也是一种非常有趣的移动用户体验设计方法。

RecyclerView

在recyclerview中设置这个解决了问题


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.