尝试在RecyclerView上垂直拖动时,BottomSheet不响应拖动事件.可能这是因为对于具有水平方向的LayoutManager禁用了垂直滚动.
我已经尝试重写LinearLayoutManager.canScrollVertically()并返回true.这种工作..如果你以非常小心的方式垂直拖动,BottomSheet将响应.但是,只要涉及任何水平移动,BottomSheet就会停止响应垂直拖动事件.
我不确定覆盖canScrollVertically()是否是正确的方法 – 从用户体验的角度来看肯定是不对的.
我还注意到,如果我使用ViewPager而不是带有水平方向LayoutManager的RecyclerView,BottomSheet会根据需要响应垂直滑动事件.
是否还有其他一些LayoutManager,RecyclerView,BottomSheet Behavior或其他方法可以帮助将垂直滚动事件传播到BottomSheet行为?
这里有一个问题的例子:
https://github.com/timusus/bottomsheet-test
(问题可以通过提交#f59a7031转载)
只需展开第一个底页.
解决方法
为什么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”,否则您的RecyclerView将不会占据整个高度.
但它仍然无法正常工作.为什么?必须告知RecyclerView将垂直滚动传递给父级.怎么样?答案是recyclerView.setNestedScrollingEnabled(false);,但更好地描述了here.