在实现之前,不得不先了解一个概念 ViewHolder
。
在 Android 中,适配器模式通常用于将数据与列表视图(如 ListView 或 RecyclerView)进行绑定。ViewHolder 是在适配器模式中一个常见概念,在 Android 中用于优化列表性能。ViewHolder 的作用是持有列表项的视图组件的引用,并在适配器中进行缓存。
为了避免在 getView()
或 onBindViewHolder()
方法中频繁地调用 findViewById()
。ViewHolder 模式的做法是在 getView()
或 onBindViewHolder()
方法中使用一个内部类 ViewHolder 来持有列表项的视图组件的引用。通过在首次创建列表项时,通过 findViewById()
方法找到视图组件,并将其存储在 ViewHolder 对象中。然后,在后续调用中可以直接访问 ViewHolder 中的视图组件,而无需再次查找。
ViewHolder 的使用可以减少重复的查找操作,提高列表的滚动性能和响应速度。以下是具体实现步骤:
创建适配器类 MyAdapter,继承 RecyclerView.Adapter
适配器实例,并指定范型参数为 MyAdapter.ViewHolder,用于指定数据项的类型。
class MyAdapter(private val dataList: List<DataItem>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
// ViewHolder 内部类和其他方法在这里实现
}
复制代码
创建 ViewHolder 内部类
在适配器类中创建一个继承自 RecyclerView.ViewHolder
的内部类 ViewHolder,用于表示每个列表项的视图和相关操作;ViewHolder 的主构造函数要传入一个 View 参数,这个参数通常是 RecyclerView
子项的最外层布局,然后就可以通过 findViewById()
方法获取布局中的 textView
等实例。
例如:
class MyAdapter(private val dataList: List<DataItem>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
// 在这里获取视图组件的引用
// 例如:val textView: TextView = itemView.findViewById(R.id.textView)
}
// 其他方法在这里实现
}
复制代码
重写必要的方法
主要有三个方法 onCreateViewHolder()
、onBindViewHolder()
、getItemCount()
主要包括创建 ViewHolder,绑定数据以及获取数据项数量,例如
class MyAdapter(private val dataList: List<DataItem>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
// 在这里获取视图组件的引用
// 例如:val textView: TextView = itemView.findViewById(R.id.textView)
}
// 创建 ViewHolder 实例,并将列表项的布局资源转换为视图
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)
return ViewHolder(view)
}
// 根据位置获取对应的数据项,并将数据绑定到 ViewHolder 中的视图组件上,会在每个子项被滚动到屏幕内时执行。
//通过posttion 参数得到当前项DataItem的实例,然后再将数据设置到ViewHolder的ImageView和TextView中。
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val dataItem = dataList[position]
// 在这里绑定数据到视图组件
// 例如:holder.textView.text = dataItem.text
}
// 在 getItemCount() 方法中返回数据项的数量;用于告诉 RecyclerView一共有多少子项。
override fun getItemCount(): Int {
return dataList.size
}
}
复制代码
三个方法具体的含义已经在上述注释中写明。
适配器的使用
和 ListView 中的适配器差不多,首先创建适配器实例,并将其设置给 RecyclerView。
val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
val adapter = MyAdapter(dataList)
recyclerView.adapter = adapter
复制代码
至此,标准的 RecyclerView 适配器 就构建完成啦。
评论