> 技术文档 > Android之recyclerView_android recyclerview

Android之recyclerView_android recyclerview


一、概念

RecyclerView 是 Android 提供的一种高级组件,用于在屏幕上展示大量数据(如列表或瀑布流布局)的视图

recycleview其实是一种容器,显示所有的内容和交互

会事先预加载一屏,提高了效率

注意:上面三个视图是预加载好的,三个外的视图就放在重复队列

二、特点:

  1. 高效复用视图RecyclerView 通过视图持有者模式(ViewHolder Pattern)来复用子项视图,减少了内存消耗和资源使用,提高了滚动性能。

  2. 灵活的布局管理:使用 LayoutManager 接口,可以轻松地实现不同类型的布局(如线性布局、网格布局、瀑布流布局等)。

  3. 动画支持RecyclerView 提供了内置的动画系统,可以轻松添加增加、删除和移动项时的动画效果。

  4. 数据变化监听:它能够高效处理数据集的更改,并自动更新显示的内容,使用 Adapter 来管理数据与视图之间的绑定

三、使用场景:

1. 列表展示

`RecyclerView` 最常见的用途是展示列表数据,比如联系人列表、消息列表、商品列表等。它能够高效地处理大量数据项,并支持滚动。

 2. 网格布局

当需要以网格形式展示数据时,`RecyclerView` 可以通过 `GridLayoutManager` 实现。例如,图片库、商品展示等场景。

3. 瀑布流布局

使用 `StaggeredGridLayoutManager`,`RecyclerView` 可以实现瀑布流效果,适合展示不规则大小的内容,如 Pinterest 风格的图片墙。

 4. 动态数据更新

`RecyclerView` 支持动态更新数据集,可以在不重建整个列表的情况下,添加、删除或修改数据项。这使得它非常适合需要频繁更新的场景,如聊天应用。

 5. 分组列表

通过自定义适配器和视图类型,`RecyclerView` 可以实现分组列表的效果,例如分类商品、分组联系人等。

6. 自定义视图

`RecyclerView` 可以创建自定义的视图项,适合需要复杂布局的场景,比如带有图片、文本和按钮的复杂列表项。

7. 支持多种交互

`RecyclerView` 支持多种用户交互,如拖拽、滑动删除等,适合需要用户交互的场景。

四、使用步骤

在这里item样式的种类有所不同的话用法上也会有一些差别

1、只有一种样式

1、添加依赖

implementation \'androidx.recyclerview:recyclerview:1.2.1\' // 或者最新版本

2、创建recycleview对象

在xml中创建是最方便的,除此之外也可以用代码创建

3、配置recyclerView

在fragment里配置recyclerView,及其布局方式

4、创建adapter管理recyclerview,以及创建一个内部类viewHolder

创建adapter管理recyclerview,以及创建一个viewHolder持有一个view(viewHolder是重复的)(这是大概的框架)

5、创建数据源

 6、在adapter里设置数据源

7、创建一个样式,确定每一个item的样式

   

 

8、再在viewHolder里面解析出来,

9、配置item个数

10、在viewHolder这里配置一些item具体的数据

注意这里的是持有一个view且这个模板是重复利用的

 11、绑定数据,告诉每一个viewHolder该显示什么内容

 

12、配置适配器(adapter)以及一些数据源

13、具体代码

fragment里的

package com.example.littlepainter.homeimport android.os.Bundleimport android.view.LayoutInflaterimport android.view.Viewimport android.view.ViewGroupimport androidx.fragment.app.Fragmentimport androidx.recyclerview.widget.LinearLayoutManagerimport androidx.recyclerview.widget.PagerSnapHelperimport androidx.recyclerview.widget.RecyclerViewimport androidx.recyclerview.widget.StaggeredGridLayoutManagerimport com.example.littlepainter.Rclass HomeFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_home, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) //配置recyclerView val recyclerView = view.findViewById(R.id.recyclerView) //配置布局方式 recyclerView.layoutManager = LinearLayoutManager( requireContext(),//可选的 RecyclerView.VERTICAL,//Horizontal纵向和横向分布 false//是否需要反过来布局 ) //按页显示 // PagerSnapHelper().attachToRecyclerView(recyclerView) //配置适配器 val mAdapter = QQAdapter() //val mAdapter = ContactAdapter() recyclerView.adapter = mAdapter //配置数据源 mAdapter.setData(listOf( Friend(R.drawable.f1,\"Jack\",\"\"), Friend(R.drawable.baseline_language_24,\"Rouse\",\"\"), Friend(R.drawable.baseline_language_24,\"Lily\",\"\"), Friend(R.drawable.baseline_language_24,\"Marry\",\"\"), Friend(R.drawable.baseline_language_24,\"Jack\",\"\"), Friend(R.drawable.baseline_language_24,\"Rouse\",\"\"), Friend(R.drawable.baseline_language_24,\"Lily\",\"\"), Friend(R.drawable.baseline_language_24,\"Marry\",\"\"), )) }}

adapter

package com.example.littlepainter.homeimport android.view.LayoutInflaterimport android.view.Viewimport android.view.ViewGroupimport android.widget.ImageViewimport android.widget.TextViewimport androidx.core.graphics.drawable.toDrawableimport androidx.recyclerview.widget.RecyclerViewimport com.example.littlepainter.R/**创建adapter管理recyclerview显示的子视图item*/class QQAdapter:RecyclerView.Adapter() { private var mFriends = emptyList() /**创建一个viewHolder 确定每个item的样式*/ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { //解析layout资源 val layoutInflater = LayoutInflater.from(parent.context) var view = layoutInflater.inflate(R.layout.layout_qq_item,parent,false) return MyViewHolder(view) } /**配置item个数*/ override fun getItemCount(): Int { return mFriends.size } /**绑定数据,告诉每一个viewHolder该显示什么内容*/ override fun onBindViewHolder(holder: MyViewHolder, position: Int) { //取出position对应的数据源 拿给view Holder去显示 holder.bind(mFriends[position]) } /**外部设置数据源*/ fun setData(friends:List){ mFriends = friends } /**创建一个viewHolder,持有一个view(重复利用的是viewHolder)*/ class MyViewHolder(view:View): RecyclerView.ViewHolder(view) { fun bind(mode:Friend){ val iconImageView = itemView.findViewById(R.id.imageView) val nameTextView = itemView.findViewById(R.id.textView) iconImageView.setImageDrawable(mode.view.toDrawable()) nameTextView.text = mode.name } }}

2、多种样式(以两个为例)

 如果是有不同的样式,则建立多个viewHolder(有几种样式就建立个),其他的和以上一个的都差不多 

 1、建立Adapter 

管理recyclerview(大致框架是这样的)和一个的基本没什么区别

注意

class ContactAdapter:RecyclerView.Adapter()这里的类型有点区别当个的是具体的内部类的名称,多个则是RecyclerView.ViewHolder

2、建立内部类viewHolder

例如这里弄了两个样式,就建立两个viewHolder

 

3、定义外部数据源以及在adapter里设置数据源

 在adapter里设置数据源

 

4、创建一个样式,确定每一个item的样式

 

 5、根据数据源配置当前这个item应该是哪种关系类型的view

6、在onCreateViewHolder中解析出每种样式

根据viewType创建对应的viewHolder对象并将对应的样式解析出来

 

7、配置item的个数

这个是一样的

 8、绑定数据,告诉每一个viewHolder该显示什么内容 

 

9、根据不同类型,绑定不同数据

 

10、在回到fragment中来配置适配器以及数据源

具体代码:

package com.example.littlepainter.homeimport android.os.Bundleimport android.view.LayoutInflaterimport android.view.Viewimport android.view.ViewGroupimport androidx.fragment.app.Fragmentimport androidx.recyclerview.widget.LinearLayoutManagerimport androidx.recyclerview.widget.PagerSnapHelperimport androidx.recyclerview.widget.RecyclerViewimport androidx.recyclerview.widget.StaggeredGridLayoutManagerimport com.example.littlepainter.Rclass HomeFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_home, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) //配置recyclerView val recyclerView = view.findViewById(R.id.recyclerView) //配置布局方式 recyclerView.layoutManager = LinearLayoutManager( requireContext(),//可选的 RecyclerView.VERTICAL,//Horizontal纵向和横向分布 false//是否需要反过来布局 ) //按页显示 // PagerSnapHelper().attachToRecyclerView(recyclerView) //配置适配器 //val mAdapter = QQAdapter() val mAdapter = ContactAdapter() recyclerView.adapter = mAdapter //配置数据源 mAdapter.setData(listOf( Friend(isFriend = true, title = \"同班同学\"), Friend(R.drawable.f1,\"Jack\",\"\"), Friend(R.drawable.baseline_language_24,\"Rouse\",\"\"), Friend(R.drawable.baseline_language_24,\"Lily\",\"\"), Friend(R.drawable.baseline_language_24,\"Marry\",\"\"), Friend(isFriend = true, title = \"大学同学\"), Friend(R.drawable.baseline_language_24,\"Jack\",\"\"), Friend(R.drawable.baseline_language_24,\"Rouse\",\"\"), Friend(R.drawable.baseline_language_24,\"Lily\",\"\"), Friend(R.drawable.baseline_language_24,\"Marry\",\"\"), )) }}
package com.example.littlepainter.homeimport android.view.LayoutInflaterimport android.view.Viewimport android.view.ViewGroupimport android.widget.ImageViewimport android.widget.TextViewimport androidx.core.graphics.drawable.toDrawableimport androidx.recyclerview.widget.RecyclerViewimport com.example.littlepainter.Rclass ContactAdapter:RecyclerView.Adapter() { private var mFriend = emptyList() private val TYPE_NORMAL = 0 //定义类型 private val TYPE_TILE = 1 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val inflter = LayoutInflater.from(parent.context)//创建解析器 return if(viewType == TYPE_NORMAL){//根据viewType创建对应的viewHolder对象 FriendViewHolder(inflter.inflate(R.layout.layout_qq_item,parent,false)) }else{ SecondViewHolder(inflter.inflate(R.layout.layout_select_item,parent,false)) } } override fun getItemCount(): Int { return mFriend.size } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if(mFriend[position].title == \"组名\"){ (holder as FriendViewHolder).bind(mFriend[position]) }else{ (holder as SecondViewHolder).bind(mFriend[position]) } } //根据数据源配置当前这个item应该是哪种关系类型的view override fun getItemViewType(position: Int): Int { val model = mFriend[position] return if(model.title == \"组名\" ) TYPE_NORMAL else TYPE_TILE } fun setData(friends: List) { mFriend = friends } class FriendViewHolder(view:View):RecyclerView.ViewHolder(view){ fun bind(mode:Friend){ val iconImageView = itemView.findViewById(R.id.imageView) val text = itemView.findViewById(R.id.textView) iconImageView.setImageDrawable(mode.view.toDrawable()) text.text = mode.name } } class SecondViewHolder(view:View):RecyclerView.ViewHolder(view){ fun bind(mode:Friend){ val titleTextView = itemView.findViewById(R.id.textView3) titleTextView.text = mode.title } }}
package com.example.littlepainter.homeimport android.view.Viewdata class Friend( val view: Int = 0, val name:String = \"\", val content:String = \"\",val isFriend:Boolean = true, val title:String = \"组名\" )

台灣與大陸溝通