前言
在一个app里,如果对不同样式的recycleview都使用一个新的adapter,不仅代码繁琐项目臃肿,而且维护成本太高了。最近搭建新项目,尝试使用了multiTypeAdapter。本篇文章来简单写一下multiTypeAdapter的用法和源码结构。
MultiTypeAdapter简介
源码地址:https://github.com/drakeet/MultiType
MultiType可以在一个recycleview中展示出不同样式的item。在新建recycleview的时候使用multiType,只需要创建item样式,无需添加新的adapter。
用法
使用MultiTypeAdapter,需要新建一个数据类和一个继承自ItemVIewBinder的绑定类。绑定类中需要重写两个函数,在onCreateViewHolder函数中完成布局资源的绑定,在onBindViewHolder中完成对view中数据的填充以及页面渲染等工作。绑定类中需要使用内部类来实现viewHolder,指定item的视图。
Kotlin代码实现如下:
1、在build.gradle中加入如下代码,导入multiType包。
dependencies {
implementation 'me.drakeet.multitype:multitype:4.0.0-alpha3'
}
2、创建数据类
data class Text(
val value:String)
3、创建一个继承ItemViewBinder的绑定类。
class TextViewBinder: ItemViewBinder<Test, TextViewBinder.ViewHolder>() {
override fun onCreateViewHolder(inflater: LayoutInflater, parent: ViewGroup): ViewHolder {
return ViewHolder(inflater.inflate(R.layout.item_test, parent, false))
}
override fun onBindViewHolder(holder: ViewHolder, item: Foo) {
holder.testView.text = item.value
Log.d("ItemViewBinder API", "position: ${getPosition(holder)}")
Log.d("ItemViewBinder API", "items: $adapterItems")
Log.d("ItemViewBinder API", "adapter: $adapter")
Log.d("More", "Context: ${holder.itemView.context}")
}
inner class ViewHolder(itemView : View): RecyclerView.ViewHolder(itemView) {
val testView: TextView = itemView.findViewById(R.id.text)
}
}
4、在activity中设置recycleView,使用register函数完成adapter的绑定。
class MainActivity : AppCompatActivity() {
private val textAdapter = MultiTypeAdapter().apply {
register(TextViewBinder())
}
lateinit var items: MutableList<Any>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = findViewById<RecyclerView>(R.id.list_item)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = textAdapter
val textItem = Text("world")
items = ArrayList()
for (i in 0..19) {
items.add(textItem)
}
textAdapter.items = items
textAdapter.notifyDataSetChanged()
}
以上就实现了最简单的recycleview。
实现原理
从MultiTypeAdapter类开始分析:
使用@JvmOverLoads注解,完成多个构造函数的重载。该类是继承自RecyclerView.Adapter类,使用register函数将itemviewBinder和数据类绑定。