为什么 ViewPager 不在 CoordinatorLayout 内滚动?

问题描述 投票:0回答:1

我想做什么?

您好,我正在尝试在 Android 应用程序中开发用户配置文件的视图,为此我使用 CoordinatorLayout,在其中,我引入了 RecyclerView 作为可滚动元素。

我的实际问题

问题是,虽然我的 RecyclerView 在滚动时激活 CoordinatorLayout,但如果在 RecyclerView 内的每个 ViewHolder 中添加一个 ViewPager 并尝试从中滚动,我的 CoordinatorLayout 不起作用。

我之前尝试过什么?

一开始,我的 RecyclerView 嵌入在一个片段中,我想在多个视图中重用它,但发现它不起作用,我通过将我的 RecyclerView 从片段中取出并将其作为其直接子元素添加到我的 CoordinatorLayout 中来简化它。

一段时间后,在阅读了 StackOverflow 上的各种文章后,我尝试用 NestedScrollView 包装我的 RecyclerView,但这也不起作用。

带有嵌套回收器视图的协调器布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".ScrollingActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:background="#3F51B5"
        android:fitsSystemWindows="true"
        android:theme="@style/Theme.CoordinatorQuestion.AppBarOverlay">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:toolbarId="@+id/toolbar">

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/Theme.CoordinatorQuestion.PopupOverlay" />

        </com.google.android.material.appbar.CollapsingToolbarLayout>
    </com.google.android.material.appbar.AppBarLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#673AB7"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context=".ScrollingActivity" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

将视图支架放置在回收器视图内:

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/purple_200"
    android:orientation="vertical"
    android:paddingTop="40dp">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:background="#9C27B0"
        />

    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:layout_marginTop="40dp" />

</androidx.appcompat.widget.LinearLayoutCompat>

ViewPager2 内的媒体视图支架(如果您尝试滚动按下图像,CoordinatorLayout 不会移动):

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.AppCompatImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_margin="20dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:background="@drawable/ic_launcher_background"
    android:src="@drawable/ic_launcher_foreground" />

一些实用信息

这是一个视频,我在其中直观地展示了我的问题:https://github.com/RafaelAmoMoralDev/CoordinatorQuestion/blob/main/coordinatorquestion.mp4?raw=true

这里是存储库,如果您愿意,可以在其中下载一个小项目,在其中查看我的问题的示例代码:https://github.com/RafaelAmoMoralDev/CoordinatorQuestion

¡提前致谢!

android android-recyclerview
1个回答
0
投票

我最近遇到了同样的问题,RecyclerView 托管 ViewHolders,其中包含 ViewPager2 及其下方的一些文本视图。 CoordinatorLayout 将响应在 TextView 上启动的滚动,但不会响应在 ViewPager 或其视图上启动的滚动。这似乎是在 ViewPager 中启用嵌套滚动的问题。

为了让嵌套滚动按预期工作,我必须关闭 ViewPager2 的子 RecyclerView 中的嵌套滚动。

fun disableNestedScrolling(viewPager: ViewPager2) {
    (viewPager.children.firstOrNull { it is RecyclerView } as? RecyclerView)?.isNestedScrollingEnabled = false
}

仍然不确定是什么导致了这个问题,我的猜测是 ViewPager 的 RecyclerView 中的嵌套滚动事件被 ViewPager 捕获并被吞没。但我一直没能找到它发生在哪里。

© www.soinside.com 2019 - 2024. All rights reserved.