BottomSheet:嵌套滚动问题(RecyclerView和NestedScrollView)

时间:2019-06-08 20:09:20

标签: android android-recyclerview bottom-sheet android-nestedscrollview

我有一个相当复杂的 BottomSheetLayout,其布局如下

我的底部工作表的根视图是一个自定义FrameLayout,可以自定义其底角(包括背景和子级)。其他(与触摸无关)

然后,我使用通常的ConstraintLayout来布置我的底表。

ConstraintLayout除其他视图外还包含垂直 RecyclerView

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="10dp">

    <!-- other views -->

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/events"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="25dp"
        android:layout_marginBottom="74dp"
        app:layout_constraintTop_toBottomOf="@+id/days"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:background="@{viewModel.colors.defaultBackgroundColor}"
        tools:background="#ECF0F3"
        android:orientation="vertical"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        tools:listitem="@layout/event_item"
        tools:itemCount="10" />

</androidx.constraintlayout.widget.ConstraintLayout>

拖动底页时没有特别的问题,但是,当完全展开时,我希望能够滚动RecyclerView的内容。但是我不能。

经过大量研究,我设法通过在Fragment的视图膨胀时启用滚动来使其滚动:

ViewCompat.setNestedScrollingEnabled(this.binding.bottomSheetEvents.getRoot(), true);

但是,这样做有一个奇怪的结果。当我的底部工作表的状态为EXPANDED时,我终于可以滚动RecyclerView了,但是绝对没有办法再拖动我的底部工作表了:它仍然完全展开。

我尝试了其他几种方法。

  1. 我尝试包装NestedScrollView。根据过去的经验,由于NestedScrollView,我可以滚动显示底部的全部内容,但是在这种情况下,我只想滚动RecyclerView。之上的一切都必须保持闲置状态。
  2. this.binding.bottomSheetEvents.events.setNestedScrollingEnabled(false);累了,但没什么区别。

我的信念是,当底部工作表完全展开时,它会将滚动事件分派给可以支持它的内部子级。而且,倒退,它知道在某个时候何时使用希望折叠所述底片。所以我想那里肯定发生了什么问题。

更多信息:

  • 此底片包含在我的片段中,其根视图显然是CoordinatorLayout
  • 该片段还与CoordinatorLayout一起托管在AppBar
  • 包含布局使用app:layout_behavior="@string/bottom_sheet_behavior"
  • 并且包含布局还使用behavior_fitToContents设置为 false ,因此我可以使用方法setExpandedOffset来防止底部页面到达顶部。
  • 使用的版本: 1.1.0-alpha07

感谢您的帮助!

0 个答案:

没有答案