b7woreo / various

RecyclerView#Adapter创建工具,支持灵活的列表Adapter创建并复用ViewHolder逻辑

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

various

这是一个用来创建 RecyclerView.Adapter 的工具类,它着重要于完成数据到 ViewHolder 的映射,以便捷的方式创建多类型 Adapter、复用 Item 逻辑。

基础用法

1. 添加依赖

implementation 'com.chrnie:various:1.0.0'

2. 编写视图数据类型和 ViewBinder

每个Item都有一个对应的数据类型,例如一条新闻:

class NewsVO(
  val title: String,
  val brief: String
) {
  fun onClick() {
    // do something on click
  }
}

每种数据类型至少有一个相对应的 ViewBinder,ViewBinder API 接口类似于 Adapter。

class NewsViewBinder() : ViewBinder<NewsVO, NewsViewBinder.NewsViewHolder>() {

  override fun onCreateViewHolder(inflater: LayoutInflater, parent: ViewGroup): NewsViewHolder {
    val view = inflater.inflate(R.layout.item_news, parent, false)
    return NewsViewHolder(view)
  }

  override fun onBindViewHolder(holder: NewsViewHolder, data: NewsVO, payloads: List<Any>) {
    holder.title.text = data.title
    holder.brief.text = data.brief
    holder.itemView.setOnClickListener { data.onClick() }
  }

  class NewsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    val title: TextView by lazy { itemView.findViewById<TextView>(R.id.tvTitle) }
    val brief: TextView by lazy { itemView.findViewById<TextView>(R.id.tvBrief) }
  }
}

这样 Item 中的逻辑全部转移到了 ViewBinder 中,可以在多个列表间轻松复用。

3. 创建Adapter

private val adapter: Various<NewsVO> by lazy {
    Various.Builder<NewsVO>()
      .register(NewsVO::class, NewsViewBinder())
      .build()
}

4. 添加要显示的数据

adapter.dataList = arrayListOf(
    NewsVO("第一条新闻", "第一条新闻简介"),
    NewsVO("第二条新闻", "第二条新闻简介"),
    NewsVO("第三条新闻", "第三条新闻简介"),
    NewsVO("第四条新闻", "第四条新闻简介")
)
adapter.notifyDataSetChanged()

使用 Lambda

当一个 Item 不需要复用逻辑,并且只简单的创建和绑定视图,那么可以通过使用 Lambda 快速完成。

private val adapter: Various<NewsVO> by lazy {
    Various.Builder<NewsVO>(CustomItemMatcherFactory())
      .register(
        NewsVO::class,
        { inflater, parent ->
          val view = inflater.inflate(R.layout.item_news, parent, false)
          NewsViewHolder(view)
        }, { holder, data, _ ->
          holder.title.text = data.title
          holder.brief.text = data.brief
          holder.itemView.setOnClickListener { data.onClick() }
        }
    ).build()

定制 ItemMatcher

如果对默认的 ItemMatcher 不满意,那么可以实现 ItemMatcher 及 ItemMatcher.Factory 接口并在创建 Various 时将其作为参数传入。

private val adapter: Various<NewsVO> by lazy {
    Various.Builder<NewsVO>(CustomItemMatcherFactory())
        .register(NewsVO::class, NewsViewBinder())
        .build()
}

License

MIT License

About

RecyclerView#Adapter创建工具,支持灵活的列表Adapter创建并复用ViewHolder逻辑

License:MIT License


Languages

Language:Kotlin 96.3%Language:Shell 3.7%