我使用的是 ViewPager2,它有两个垂直方向的片段。当用户向下滑动到第二个片段时,有一个 RecyclerView 以相同的垂直方向滚动内容。
问题是当我滚动 RecyclerView 的内容时,有时 ViewPager2 捕获滚动事件,有时 RecyclerView 捕获滚动事件。
我想这样,当用户滚动到 RecyclerView 的顶部时,只有当用户到达 RecyclerView 中内容的顶部时,ViewPager 才会向上滑动回到第一个片段。
我尝试过使用 recyclerView.isNestedScrollingEnabled = false
没有太多运气。我还尝试将 RecyclerView 放入 NestedScrollView 中,但不建议这样做,因为 RecyclerView 然后会创建数据集所需的每个 ViewHolder,这显然效率不高。
所以...我只需阅读一些内容就可以弄清楚文档 https://developer.android.com/training/animation/vp2-migration#nested-scrollables????。我将在这里发布答案,以便它可以帮助其他遇到类似问题的人:
由于 ViewPager2 不能很好地支持嵌套滚动视图,与 NestedScrollView 不同,我们需要在布局中使用自定义包装器来包装嵌套滚动视图,以便能够处理被嵌套滚动视图父级拦截的触摸和滑动事件。在我们的例子中,子级将是 RecyclerView,父级将是 ViewPager2。
你可以找到包装类here https://github.com/android/views-widgets-samples/blob/master/ViewPager2/app/src/main/java/androidx/viewpager2/integration/testapp/NestedScrollableHost.kt。只需将其添加到您的项目中,然后将可滚动视图包装在其中,如下所示:
<NestedScrollableHost
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" />
</NestedScrollableHost>
这里有几点需要注意:文档 https://developer.android.com/training/animation/vp2-migration#nested-scrollables表示此解决方案不适用于 ViewPager 内其他可滚动视图内的可滚动视图。此解决方案仅适用于 ViewPager 的即时滚动视图。
另一个注意事项是包装类使用requestDisallowInterceptTouchEvent()
确保子可滚动视图告诉父级在子级可滚动视图不滚动的情况下不要滚动需要滚动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)