我有一个RecyclerView
,它使用LinearLayoutManager
和HORIZONTAL
方向,嵌套在使用BottomSheet
Behavior
的FrameLayout
中。
当尝试垂直拖动RecyclerView
时,BottomSheet
不响应拖动事件。推测这是因为水平方向的LayoutManager
禁用了垂直滚动。
我试过重写LinearLayoutManager.canScrollVertically()
并返回true。这 *sort * 工作..如果你非常小心地垂直拖动,BottomSheet
会响应。但是,一旦涉及任何水平移动,BottomSheet
就停止响应垂直拖动事件。
我不确定覆盖canScrollVertically()
是否是正确的方法--从用户体验的Angular 来看,这肯定是不正确的。
我还注意到,如果我使用ViewPager
而不是RecyclerView
和水平方向的LayoutManager
,BottomSheet
会根据需要响应垂直滑动事件。
是否有其他LayoutManager
、RecyclerView
、BottomSheet Behavior
或其他方法可以帮助将垂直滚动事件传播到BottomSheet Behavior
上?
这里有一个问题的例子:
https://github.com/timusus/bottomsheet-test(问题可以通过提交#f59a7031重现)
展开第一个底页。
2条答案
按热度按时间gcmastyq1#
问题出在哪里呢?在
FrameLayout
中。当BottomSheet
放在CoordinatorLayout
中时,BottomSheet
可以完美地工作。然后BottomSheet
可以通过CoordinatorLayout
将其滚动状态传递给作为CoordinatorLayout
直接子级的其他视图。为什么
RecyclerView
不能将滚动状态传递给BottomSheet
?它不是CoordinatorLayout
的直接子节点。但是有一种方法可以传递它们:RecyclerView
必须在实现NestedScrollingParent
和NestedScrollingChild
的视图中。答案是:NestedScrollView
因此,您的
fragment_sheetX.xml
布局应该如下所示:另外请注意
android:fillViewport="true"
,否则,您的RecyclerView
将不会占用整个高度。但是它仍然不起作用。为什么?
RecyclerView
必须被告知将垂直滚动传递给父级。如何?答案是recyclerView.setNestedScrollingEnabled(false);
,但更好地描述了here。顺便说一句:
MultiSheetView
是一个很棒的特性,也是一个非常有趣的移动的用户体验设计方法。imzjd6km2#
在recyclerview中设置此选项解决了问题