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

Tim*_*eed 13 android android-recyclerview androiddesignsupport bottom-sheet

我有一个RecyclerView使用LinearLayoutManagerHORIZONTAL方向,嵌套在FrameLayout使用BottomSheet Behavior.

当尝试垂直拖动时RecyclerView,BottomSheet不会响应拖动事件.据推测这是因为对于LayoutManager具有水平方向的垂直滚动被禁用.

我已经尝试重写LinearLayoutManager.canScrollVertically()并返回true.这种形式的作品.如果你在一个非常谨慎的方式垂直拖动时,BottomSheet会作出回应.然而,只要涉及任何水平移动,BottomSheet停止响应垂直拖动事件.

我不确定覆盖canScrollVertically()是否是正确的方法 - 从用户体验的角度来看,它肯定是不对的.

我还注意到,如果我使用的是水平方向ViewPager而不是RecyclerView水平方向LayoutManager,则会BottomSheet根据需要响应垂直滑动事件.

是否有一些其他的方法LayoutManager,RecyclerView,BottomSheet Behavior,或者干脆东西,可以帮助传播到垂直滚动的事件BottomSheet Behavior

这里有一个问题的例子:

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

只需展开第一个底页.

R. *_*ski 24

问题出在哪里?在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>
Run Code Online (Sandbox Code Playgroud)

android:fillViewport="true"另请注意,您RecyclerView不会占据整个高度.

但它仍然无法正常工作.为什么?RecyclerView必须告诉他们将垂直滚动传递给父级.怎么样?答案是recyclerView.setNestedScrollingEnabled(false);,但这里有更好的描述.

顺便说一句:MultiSheetView对移动用户体验设计来说,这是一个很棒的功能和非常有趣的方法.

  • 这种方法使`RecyclerView`具有与`wrap_content`相同的高度,这对于性能来说是_terrible_,因为它会使所有子级的`ViewHolder`单独膨胀而无需重用 (5认同)