使用RecyclerView 可以实现ListView(列表), GridView(网格),StaggeredView(瀑布流)的效果,
并且可以自动回收没有使用的条目。
目录
1. 布局文件使用RecyclerView:
2. 创建RecyclerView的条目
3. 定义条目的使用的数据:
4. 创建适配器Adapter 3部曲 (关键)
4.1 继承 RecyclerView.Adapter 并且实现 泛型 RecyclerView.ViewHolder
4.2 构造函数参数传入数据,并使用成员变量保存
4.3 重写获取条目数目、创建ViewHolder、绑定ViewHolder的方法
5. Activity 3部曲
5.1 初始化数据
5.2 设置布局管理器
5.3 设置适配器
其中需要在app 的build.gradle中添加RecyclerView包的依赖(不同SDK版本, 会有些许差异):
dependencies {
//此处省略其它的配置
implementation 'androidx.recyclerview:recyclerview:1.1.0'
}
其中CardView 只是起到添加边框的作用,使得看起来稍微好看的,装饰作用,
需要在app 的build.gradle中添加依赖
//此处省略其它
implementation 'androidx.cardview:cardview:1.0.0'
UserData, 一个String 类型的名字, 一个对应的图片(Int 类型的id)
package com.example.androidrecyclerviewtest.data
class UserData {
var userName: String
var userImageId: Int
constructor(userNameId: String, userImageId: Int) {
this.userName = userNameId
this.userImageId = userImageId
}
}
其中,名字和图片的资源定义在一个常量类中,方便管理:
pic1~pic12 为图片,可以随意加到drawable资源文件+下,
user_name1 ~user_name12 为名字,可以随意加到strings.xml 中
object CommonConstants {
val PIC_IDS = mutableListOf(
R.drawable.pic1,
R.drawable.pic2,
R.drawable.pic3,
R.drawable.pic4,
R.drawable.pic5,
R.drawable.pic6,
R.drawable.pic7,
R.drawable.pic8,
R.drawable.pic9,
R.drawable.pic10,
R.drawable.pic11,
R.drawable.pic12
)
val USER_NAMES = mutableListOf(
R.string.user_name1,
R.string.user_name2,
R.string.user_name3,
R.string.user_name4,
R.string.user_name5,
R.string.user_name6,
R.string.user_name7,
R.string.user_name8,
R.string.user_name9,
R.string.user_name10,
R.string.user_name11,
R.string.user_name12
)
}
适配器决定了如何把数据映射到条目上显示。
ViewHolder 可以理解为每个条目的显示缓存,是Adpater的关键
class ListViewAdpater :
RecyclerView.Adapter {
class InnerViewHolder : RecyclerView.ViewHolder {
//此处暂未实现
}
}
private var datas: MutableList
// 1. 适配器持有数据的引用
constructor(datas: MutableList) {
this.datas = datas
}
override fun getItemCount(): Int {
return if (datas != null) {
datas.size
} else {
0
}
}
//2. 创建条目 - 每个条目只会创建一次,后续刷新到仅调用 onBinderViewHolder 进行数据绑定
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): InnerViewHolder {
val view = View.inflate(parent.context,R.layout.item_list_view, null)
return InnerViewHolder(view)
}
//3. 绑定数据 - position 对应数据的下标号 - 数据可以变化,只要数据数目不增加,条目也不会增加
override fun onBindViewHolder(holder: InnerViewHolder, position: Int) {
holder.setData(datas[position])
}
此时,需要实现InnerViewHolder的内部操作,即把数据设置到条目上 (ItemView 为传入的条目)
class InnerViewHolder : RecyclerView.ViewHolder {
private var image: ImageView
private var nameText: TextView
constructor(itemView: View) : super(itemView) {
this.nameText = itemView.user_name
this.image = itemView.user_image
}
fun setData(userData: UserData) {
nameText.text = userData.userName
image.setImageResource(userData.userImageId)
}
}
在Activity 加载包含有recyclerview控件的布局文件
setContentView(R.layout.activity_main)
private var datas = mutableListOf()
private fun initDatas() {
for (index in 0 until USER_NAMES.size) {
datas.add(
index,
UserData(
context.getString(USER_NAMES[index]), PIC_IDS[index]
)
)
}
}
//2. 创建并设置布局管理器
var layoutManager = LinearLayoutManager(context)
layoutManager.orientation = LinearLayoutManager.VERTICAL
recycler_view.layoutManager = layoutManager
//3. 创建并设置adapter
adapter=
ListViewAdpater(datas)
recycler_view.adapter = adapter
虽然很简单,但是在实际操作一遍后,可以加深理解。
这些只是基本操作, 后续会再更新显示不同类型的条目,下拉和上拉刷新等