一、概念
RecyclerView 是 Android 提供的一种高级组件,用于在屏幕上展示大量数据(如列表或瀑布流布局)的视图。
recycleview其实是一种容器,显示所有的内容和交互
会事先预加载一屏,提高了效率

注意:上面三个视图是预加载好的,三个外的视图就放在重复队列
二、特点:
高效复用视图:
RecyclerView通过视图持有者模式(ViewHolder Pattern)来复用子项视图,减少了内存消耗和资源使用,提高了滚动性能。灵活的布局管理:使用
LayoutManager接口,可以轻松地实现不同类型的布局(如线性布局、网格布局、瀑布流布局等)。动画支持:
RecyclerView提供了内置的动画系统,可以轻松添加增加、删除和移动项时的动画效果。数据变化监听:它能够高效处理数据集的更改,并自动更新显示的内容,使用
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中创建是最方便的,除此之外也可以用代码创建
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_marginTop="100dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
3、配置recyclerView
在fragment里配置recyclerView,及其布局方式

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

5、创建数据源

6、在adapter里设置数据源

7、创建一个样式,确定每一个item的样式
<?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_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
>
<ImageView
android:id="@+id/imageView"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="270dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_launcher_background" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="刘德华"
android:textSize="20sp"
app:layout_constraintStart_toEndOf="@+id/imageView"
app:layout_constraintTop_toTopOf="@+id/imageView" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="19dp"
android:layout_marginTop="19dp"
android:text="你好,我是刘德华"
app:layout_constraintStart_toEndOf="@+id/imageView"
app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>

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

9、配置item个数

10、在viewHolder这里配置一些item具体的数据
注意这里的是持有一个view且这个模板是重复利用的

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

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

13、具体代码
fragment里的
package com.example.littlepainter.home
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.PagerSnapHelper
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.example.littlepainter.R
class 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<RecyclerView>(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.home
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.core.graphics.drawable.toDrawable
import androidx.recyclerview.widget.RecyclerView
import com.example.littlepainter.R
/**创建adapter管理recyclerview显示的子视图item*/
class QQAdapter:RecyclerView.Adapter<QQAdapter.MyViewHolder>() {
private var mFriends = emptyList<Friend>()
/**创建一个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<Friend>){
mFriends = friends
}
/**创建一个viewHolder,持有一个view(重复利用的是viewHolder)*/
class MyViewHolder(view:View): RecyclerView.ViewHolder(view) {
fun bind(mode:Friend){
val iconImageView = itemView.findViewById<ImageView>(R.id.imageView)
val nameTextView = itemView.findViewById<TextView>(R.id.textView)
iconImageView.setImageDrawable(mode.view.toDrawable())
nameTextView.text = mode.name
}
}
}
2、多种样式(以两个为例)
如果是有不同的样式,则建立多个viewHolder(有几种样式就建立个),其他的和以上一个的都差不多
1、建立Adapter
来管理recyclerview(大致框架是这样的)和一个的基本没什么区别
注意
class ContactAdapter:RecyclerView.Adapter<RecyclerView.ViewHolder>()这里的类型有点区别当个的是具体的内部类的名称,多个则是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.home
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.PagerSnapHelper
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.example.littlepainter.R
class 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<RecyclerView>(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.home
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.core.graphics.drawable.toDrawable
import androidx.recyclerview.widget.RecyclerView
import com.example.littlepainter.R
class ContactAdapter:RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var mFriend = emptyList<Friend>()
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<Friend>) {
mFriend = friends
}
class FriendViewHolder(view:View):RecyclerView.ViewHolder(view){
fun bind(mode:Friend){
val iconImageView = itemView.findViewById<ImageView>(R.id.imageView)
val text = itemView.findViewById<TextView>(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<TextView>(R.id.textView3)
titleTextView.text = mode.title
}
}
}
package com.example.littlepainter.home
import android.view.View
data class Friend(
val view: Int = 0, val name:String = "",
val content:String = "",val isFriend:Boolean = true,
val title:String = "组名"
)
938

被折叠的 条评论
为什么被折叠?



