我有一个
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
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