android-add 将 header 移动到 RecyclerView 上方

android-add moving header above RecyclerView

我需要在我的应用中的 RecyclerView 上方添加一个 header。 header 必须随着用户滚动 recyclerview(右图)而移动。我已经搜索过但没有找到最终的直接解决方案。最好和最简单的实施方法是什么?

图片来源:link

为此,您有 2 个选择。

  1. 第一种也是最简单的方法,您可以在 CoordinatorLayout 内的 CollapsingToolbarLayout 中添加一个 ImageView,然后将 app:layout_behavior="@string/appbar_scrolling_view_behavior" 添加到您的 RecyclerView

<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">

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

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

                    <ImageView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"/>

                    <androidx.appcompat.widget.Toolbar
                        android:layout_width="match_parent"
                        android:layout_height="?actionBarSize"
                        app:layout_collapseMode="pin"/>

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

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

        <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/transparent"
            android:fillViewport="true"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

</androidx.coordinatorlayout.widget.CoordinatorLayout>
  1. 滚动时具有相同效果的第二个选项是,在您的 ReyclerViewAdapter 中,它理解 2 个视图类型,一个用于图像,另一个用于项目,这样您必须将图像作为第一个项目传递您的项目列表
class CustomAdapter(
            private var list: ArrayList<String>
    ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {


        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
            return if (viewType == VIEW_TYPE_ONE) {
                ViewHolder1(LayoutInflater.from(context).inflate(R.layout.your_list_item_1, parent, false))
            } else ViewHolder2(LayoutInflater.from(context).inflate(R.layout.your_list_item_2, parent, false))
        }

        override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
            if (position == 0) {
                (holder as ViewHolder1).bind(position)
            } else {
                (holder as ViewHolder2).bind(position)
            }
        }

        override fun getItemCount(): Int {
            return list.size
        }

        override fun getItemViewType(position: Int): Int {
            return if (position == 0) {
                VIEW_TYPE_ONE
            } else VIEW_TYPE_TWO
        }


        private inner class ViewHolder1 internal constructor(itemView: View) : RecyclerView.ViewHolder(itemView) {

            var yourView: ImageView  = itemView.findViewById(R.id.yourView)

            fun bind(position: Int) {
                yourView.setImageResource(list[position])
            }
        }

        private inner class ViewHolder2 internal constructor(itemView: View) : RecyclerView.ViewHolder(itemView) {

            var yourView: TextView = itemView.findViewById(R.id.yourView)

            fun bind(position: Int) {
                yourView.text = list[position]
            }
        }

        companion object {
            private const val VIEW_TYPE_ONE = 1
            private const val VIEW_TYPE_TWO = 2
        }