如何使布局与recyclerview一起滚动

Posted

技术标签:

【中文标题】如何使布局与recyclerview一起滚动【英文标题】:How to make the layout scroll along with the recyclerview 【发布时间】:2021-05-17 20:51:08 【问题描述】:

我想知道如何像 facebook 一样进行此滚动,您可以在其中滚动 recyclerview 并且上面的视图会滚动到屏幕外,我已经尝试使用 nestedscroll 并将 recyclerview 作为 wrap_content,但是它会加载之前的所有项目打开它变得非常沉重,实际上应用程序甚至无法打开,崩溃一切......我也会发布我的布局代码,记住这个布局在一个片段内,就像 facebook 就在那里,使用viewpager 及其内部有链接到 tablayout 和自定义工具栏的片段,然后这个带有视图的 recyclerview 位于片段中的布局中[在此处输入链接描述][1]

例如GIF >> [1]:https://giphy.com/gifs/1g6zXNE3EE5MLuE7Cy

我的带有 recyclerview 的 xml 代码(这是片段布局)>>

    <?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    xmlns:tools="http://schemas.android.com/tools"
    android:fillViewport="true">
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_
        android:layout_
        tools:context=".fragments.Home">

        <LinearLayout
            android:id="@+id/linearLayout4"
            android:layout_
            android:layout_
            android:background="@color/white"
            android:orientation="vertical"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <androidx.appcompat.widget.LinearLayoutCompat
                android:id="@+id/linearLayoutCompat"
                android:layout_
                android:layout_
                android:layout_marginTop="16dp">

                <de.hdodenhof.circleimageview.CircleImageView
                    android:layout_
                    android:layout_
                    android:layout_marginStart="8dp"
                    android:layout_marginEnd="8dp"
                    android:src="@mipmap/ic_launcher" />

                <Button
                    android:id="@+id/button"
                    android:layout_
                    android:layout_
                    android:layout_marginTop="4dp"
                    android:layout_marginEnd="8dp"
                    android:layout_marginBottom="4dp"
                    android:background="@drawable/retangulo_pontas_arredondadas"
                    android:text="No que você esta pensando?"
                    android:textAlignment="viewStart"
                    android:textAppearance="@style/botaobraco" />

            </androidx.appcompat.widget.LinearLayoutCompat>

            <LinearLayout
                android:id="@+id/linearLayout"
                android:layout_
                android:layout_
                android:layout_marginTop="8dp"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/button4"
                    android:layout_
                    android:layout_
                    android:layout_marginEnd="1dp"
                    android:layout_weight="1"
                    android:text="Foto"
                    android:textAlignment="viewStart"
                    app:icon="@drawable/photo_icon" />

                <Button
                    android:id="@+id/button5"
                    android:layout_
                    android:layout_
                    android:layout_marginStart="1dp"
                    android:layout_weight="1"
                    android:text="Video"
                    android:textAlignment="viewStart"
                    app:icon="@drawable/video_icon" />
            </LinearLayout>
        </LinearLayout>

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerViewPubs"
            android:layout_
            android:layout_
            android:layout_marginBottom="1dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/linearLayout4" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>

带有 viewpager 和工具栏的我的 xml(接收者的片段)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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_
    android:layout_
    android:orientation="vertical">

    <include layout="@layout/toolbar"
        app:layout_scrollFlags="scroll|enterAlways"/>

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tabLayout"
        android:layout_
        android:layout_
        android:elevation="4dp"
        android:theme="@style/toolbarstyle"
        app:tabMode="fixed" />

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/container"
        android:layout_
        android:layout_
        android:layout_weight="1"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</LinearLayout>

在recyclerview中显示的xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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_
    android:layout_>

    <androidx.cardview.widget.CardView
        android:layout_
        android:layout_
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_
            android:layout_>

            <ImageView
                android:id="@+id/image_pub"
                android:layout_
                android:layout_
                android:layout_marginBottom="8dp"
                android:scaleType="centerCrop"
                app:layout_constraintBottom_toTopOf="@+id/linearLayout2"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintVertical_bias="0.0"
                app:srcCompat="@drawable/ds" />

            <androidx.constraintlayout.widget.ConstraintLayout
                android:id="@+id/linearLayout2"
                android:layout_
                android:layout_
                android:layout_marginTop="8dp"
                android:background="@drawable/borda_abaixo"
                android:orientation="vertical"
                app:layout_constraintBottom_toTopOf="@+id/linearLayout3"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/image_pub">


                <de.hdodenhof.circleimageview.CircleImageView
                    android:id="@+id/image_author_pub"
                    android:layout_
                    android:layout_
                    android:layout_marginStart="8dp"
                    android:layout_marginTop="8dp"
                    android:src="@mipmap/ic_launcher"
                    app:layout_constraintBottom_toTopOf="@+id/desc_pub"
                    app:layout_constraintEnd_toStartOf="@+id/name_author_pub"
                    app:layout_constraintHorizontal_bias="0.0"
                    app:layout_constraintHorizontal_chainStyle="packed"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent"
                    app:layout_constraintVertical_chainStyle="packed" />

                <TextView
                    android:id="@+id/name_author_pub"
                    android:layout_
                    android:layout_
                    android:layout_marginStart="8dp"
                    android:layout_marginEnd="8dp"
                    android:text="@string/app_name"
                    app:layout_constraintBottom_toBottomOf="@+id/image_author_pub"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintHorizontal_bias="0.5"
                    app:layout_constraintStart_toEndOf="@+id/image_author_pub"
                    app:layout_constraintTop_toTopOf="@+id/image_author_pub" />


                <TextView
                    android:id="@+id/desc_pub"
                    android:layout_
                    android:layout_
                    android:layout_marginTop="8dp"
                    android:layout_marginEnd="8dp"
                    android:maxLines="10"
                    android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas placerat tristique nulla scelerisque faucibus. Cras sollicitudin consequat risus id cursus. Nunc sit amet condimentum dui. Nam dictum lacinia nibh, eget vehicula sapien. Vestibulum eget tortor at nisl faucibus cursus eget quis arcu. Maecenas egestas, nulla id accumsan eleifend, mauris leo ornare elit, quis porta turpis metus eget tortor. Donec ultrices neque nec aliquet commodo. In dolor lorem, lobortis vel tincidunt ut, bibendum vel ligula. Nulla facilisi."
                    android:textSize="18sp"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintHorizontal_bias="0.0"
                    app:layout_constraintStart_toStartOf="@+id/image_author_pub"
                    app:layout_constraintTop_toBottomOf="@+id/image_author_pub" />

                <TextView
                    android:id="@+id/more_desc_pub"
                    android:layout_
                    android:layout_
                    android:layout_marginEnd="8dp"
                    android:layout_marginBottom="8dp"
                    android:drawableEnd="@android:drawable/arrow_down_float"
                    android:text="ver mais"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintHorizontal_bias="1.0"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/desc_pub" />
            </androidx.constraintlayout.widget.ConstraintLayout>

            <LinearLayout
                android:id="@+id/linearLayout3"
                android:layout_
                android:layout_
                android:orientation="horizontal"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/linearLayout2">

                <Button
                    android:id="@+id/curtir_pub"
                    android:layout_
                    android:layout_
                    android:layout_marginEnd="1dp"
                    android:layout_weight="1"
                    android:text="Curtir"
                    android:textColor="@color/black" />

                <Button
                    android:id="@+id/comentar_pub"
                    android:layout_
                    android:layout_
                    android:layout_marginStart="1dp"
                    android:layout_weight="1"
                    android:text="Comentar"
                    android:textColor="@color/black" />
            </LinearLayout>

            <LinearLayout
                android:layout_
                android:layout_
                android:orientation="horizontal"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/linearLayout3">

                <TextView
                    android:id="@+id/curtidas_pub"
                    android:layout_
                    android:layout_
                    android:layout_marginStart="8dp"
                    android:layout_weight="1"
                    android:text="800 Curtidas" />

                <TextView
                    android:id="@+id/coments_pub"
                    android:layout_
                    android:layout_
                    android:layout_marginEnd="8dp"
                    android:layout_weight="1"
                    android:text="300 Comentarios"
                    android:textAlignment="viewEnd" />
            </LinearLayout>

        </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.cardview.widget.CardView>

</androidx.constraintlayout.widget.ConstraintLayout>

【问题讨论】:

【参考方案1】:

查看协调器布局,这就是您共享的 GIF 中的滚动和过渡所需要的。

【讨论】:

我已经尝试过,已经研究过,甚至下载了他们使用的应用程序,但我不能以一种像样的方式做到这一点,如果你可以通过给我小费或发布代码 sn-ps 和解释来帮助我,我会接受【参考方案2】:

我设法解决了这个问题,为此我必须在 RecyclerView 中使用 MultiView,任何我想要的人都会留下链接来解释它是如何完成的。

Link

【讨论】:

以上是关于如何使布局与recyclerview一起滚动的主要内容,如果未能解决你的问题,请参考以下文章

如何使工具栏与片段中的内容一起滚动?

如何使这种自​​动布局安排与滚动视图一起使用

如何让 RecyclerView 平滑滚动?

如何使 RecyclerView 与 Composable ViewHolder 渲染更快?

将 RecyclerView 与 FirestoreRecyclerAdapter 一起使用时如何设置滚动位置?

如何让视图绑定与 RecyclerView.ViewHolder 中的 XML 布局高度一起使用,就像他们对 Kotlin Synthetics 所做的那样?