点击上方“技术最TOP”,星标公众号
重磅干货,第一时间送达作者:L_Xian
, 链接:https://juejin.im/post/5effe30e6fb9a07ea10bc869
前言
在项目开发中,总离不开列表,说到列表,就会有无穷无尽的 Adapter 需要你去实现。从而出现了很多优秀的 adapter 库。
不过很多库功能都很全面了,有很多个类,很多功能,但是实际上只用其中的一两个我感觉是很多人的现状。所以自己实现一个使用起来顺手的是一个不错的选择,特别是用在一些不是很复杂的列表时。
效果
先看看使用效果,激发一下你为数不多继续阅读的激情:
//单类型列表,默认 LinearLayoutManager
recycleView.setup {
dataSource(initData())
adapter {
addItem(R.layout.layout_item) {
bindViewHolder { data, _, _ ->
setText(R.id.number, data?.number.toString())
}
}
}
}//多类型列表
recycleView.setup {
withLayoutManager { LinearLayoutManager(context) }
dataSource(data)
adapter {
addItem(R.layout.item_setion_header) {
isForViewType { data, _ -> data is SectionHeader }
bindViewHolder { data, _, _ ->val header = data as SectionHeader
setText(R.id.section_title, header.title)
}
}
addItem(R.layout.item_user) {
isForViewType { data, _ -> data is User }
bindViewHolder { data, _, _ ->val user = data as User
setText(R.id.name, user.name)
setImageResource(R.id.avatar, user.avatarRes)//如果你的控件找不到方便赋值的方法,可以通过 findViewById 去查找val phone = findViewById(R.id.phone)
phone.text = user.phone
}
}
}
}
嗯....,感觉还可以,最少的情况下可以把一个列表代码用 10 几行就完成了。
完整代码地址
先贴完整代码地址,没地址的文章是没灵魂的:EfficientAdapter
:https://github.com/EspoirX/EfficientAdapter , 我把它命名为 EfficientAdapter ,意为高效的意思,事实上它只有 3 个文件。 至于如何使用,在地址上已经描述了,所以这篇文章主要是讲一下实现的思路。
实现思路
对 Adapter 的封装,其实无非就是对 Adapter 里面的几个回调方法进行封装罢了,最常用的方法是先定义好一个存放 ViewHolder 的列表,然后在各个回调中获取这些 ViewHolder,然后实现逻辑。
那么其中最操蛋的是哪个回调方法的封装呢?我认为是 getItemViewType
。事实上你可以在很多框架中看到让你实现获取 ViewType
的回调方法。
一步一步来,先说ViewHolder
的封装 在 EfficientAdapter
里面,我把 ViewHolder
的封装写成了 BaseViewHolder
:
class BaseViewHolder(parent: ViewGroup, resource: Int) : RecyclerView.ViewHolder(
LayoutInflater.from(parent.context).inflate(resource, parent, false)
)
这就是我的封装,够简单吧。
想什么呢,当然没这么简单,想要在上面使用效果代码中那样实现 ViewHolder 的具体逻辑,还需要有 isForViewType
,bindViewHolder
等方法。所以我要定义一个类,去提供这些方法&