首页 > 解决方案 > 在recyclerview上方滚动viewpager标题不起作用

问题描述

我尝试了两种方法来滚动 recyclerView 上方的 viewpager 标题。布局的 idandroid:id="@+id/rel_promotions_parent"与要滚动的 viewPager 一起。

  1. 使用 CoordinatorLayout,其中 viewpager 根布局具有app:layout_scrollFlags="scroll|exitUntilCollapsed"和 recyclerView 具有app:layout_behavior="@string/appbar_scrolling_view_behavior"
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white_one"
    android:fitsSystemWindows="true"

    >

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"

        >

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fitsSystemWindows="true"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"

            >

            <RelativeLayout
                android:id="@+id/rel_promotions_parent"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent"

                >

                <com.loopingviewpager.LoopingViewPager
                    android:id="@+id/viewpager"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:visibility="visible"
                    app:autoScroll="true"
                    app:isInfinite="true"
                    app:scrollInterval="2000"

                    />

                <com.loopingviewpager.indicator.CustomShapePagerIndicator
                    android:id="@+id/indicator"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBottom="@id/viewpager"
                    android:layout_centerHorizontal="true"
                    android:layout_marginBottom="@dimen/_5sdp"
                    android:visibility="visible"
                    app:indicator_spacing="4dp"

                    />

            </RelativeLayout>

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

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

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="5dp"
        android:clipToPadding="false"
        android:paddingStart="5dp"
        android:paddingEnd="5dp"
        android:paddingBottom="10dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"


        />

</androidx.coordinatorlayout.widget.CoordinatorLayout>
  1. 在链接https://medium.com/@alex.gabor中使用 motionLayout 作为示例,将约束集应用于布局android:id="@+id/rel_promotions_parent"
<RelativeLayout 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:background="@color/white_one"

    >

    <androidx.constraintlayout.motion.widget.MotionLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutDescription="@xml/scrollable_header_above_recycler_view_scene"

        >

        <RelativeLayout
            android:id="@+id/rel_promotions_parent"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"

            >

            <com.loopingviewpager.LoopingViewPager
                android:id="@+id/viewpager"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:visibility="visible"
                app:autoScroll="true"
                app:isInfinite="true"
                app:scrollInterval="2000"

                />

            <com.loopingviewpager.indicator.CustomShapePagerIndicator
                android:id="@+id/indicator"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignBottom="@id/viewpager"
                android:layout_centerHorizontal="true"
                android:layout_marginBottom="@dimen/_5sdp"
                android:visibility="visible"
                app:indicator_spacing="4dp"

                />

        </RelativeLayout>
        
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_marginTop="5dp"
            android:clipToPadding="false"
            android:paddingStart="5dp"
            android:paddingEnd="5dp"
            android:paddingBottom="10dp"
            app:layout_constraintTop_toBottomOf="@id/rel_promotions_parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"

            />
        
    </androidx.constraintlayout.motion.widget.MotionLayout>

</RelativeLayout>

在这两种情况下,只有 recyclerView 正在滚动,而 viewPager 则静止不动。如果我们尝试触摸并拖动 viewpager,它会滚动,但不是在 recyclerView 的帮助下。

有谁知道如何在 recyclerView.. 上方滚动 viewpager 标题?

标签: android-recyclerviewandroid-coordinatorlayoutswipe-gestureandroid-motionlayout

解决方案


当 recyclerView 放置在其中时,NestedScrollView 无法捕捉到滚动变化。因此,虽然实现了分页,但分配了大量内存空间并且滚动非常滞后。我所做的解决方案是将recyclerView中的标题合并为第一个元素,然后删除nestedsrollview。我还为 recyclerview 实现了 diffUtil 类回调,这也为我做了很多工作。

希望它对任何人都有帮助。


推荐阅读