😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、评论、收藏哦!👍
在实现之前,不得不先了解一个概念 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 适配器 就构建完成啦。