【android 读源码】MultiTypeAdapter使用及源码解析

前言

在一个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和数据类绑定。

 

 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值