layout: post
title: "多数状况下你的Adapter可以这样做"
categories: [编程]
tags: [Kotlin,Android]
published: True
前提条件
- MVVM 架构
- 不需要子 View 点击,仅仅是 item 的点击事件
- dataBinding 使用
- Brvah Adapter框架(非必须) 有他会让你更舒服
平常写法
平时对于一个这样的基本列表我们都是做这样的几步
- xml 中写一个 RecyclerView
- 写出对应的 Item 布局
- 新建一个 Adapter 类 并且在里面进行 数据绑定 ViewHolder创建 等等基本操作....
- 最后在 Activity/Fragment 中进行 Adapter 初始化 绑定设置等基本操作
首先我们看看一下那些步骤是省略不了的:
- 第一步 View 基础 不可省略
- 第二步 没布局玩个卵 不可省略
- 第三步 也是最耗时的这一步,我们是可以省略并且优化掉的,变成一个变量直接使用。
- 第四步 也可以变成一个方法调用
优化之后的代码
// Create Adapter
private val homeListAdapter by lazy {
BaseNoChildClickAdapter(R.layout.item_home, viewModel.itemList, BR.itemHome)
}
// Use Adapter
binding.homeRecyclerView.defaultStyle(homeListAdapter)
so 就是这样 你不必再去新建一个类去做很麻烦的事情了。两行代码而已。
背后做的事情
/**
* 不需要子控件点击使用这个
* @param T
* @property brId Int
* @constructor
*/
class BaseNoChildClickAdapter(layout: Int, data: ObservableArrayList, var brId: Int) :
BaseListAdapter(layout, data) {
override fun convert(helper: ListViewHolder?, item: T) {
helper?.let {
with(it) {
binding.setVariable(brId, item)
binding.executePendingBindings()
}
}
}
}
/**
* 基本增删的Adapter 其他自定义Adapter可继承
* @param T
* @constructor
*/
abstract class BaseListAdapter(layout: Int, data: ObservableArrayList?): BaseQuickAdapter(layout,data) {
init {
data?.addOnListChangedCallback(object :
ObservableList.OnListChangedCallback>() {
override fun onChanged(sender: ObservableList?) {
notifyDataSetChanged()
}
override fun onItemRangeRemoved(
sender: ObservableList?,
positionStart: Int,
itemCount: Int
) {
if (sender!!.isEmpty()) {
notifyDataSetChanged()
} else {
notifyItemRangeRemoved(positionStart, itemCount)
}
}
override fun onItemRangeMoved(
sender: ObservableList?,
fromPosition: Int,
toPosition: Int,
itemCount: Int
) {
notifyItemMoved(fromPosition, toPosition)
}
override fun onItemRangeInserted(
sender: ObservableList?,
positionStart: Int,
itemCount: Int
) {
notifyItemRangeInserted(positionStart, itemCount)
}
override fun onItemRangeChanged(
sender: ObservableList?,
positionStart: Int,
itemCount: Int
) {
notifyItemRangeChanged(positionStart, itemCount)
}
})
}
override fun getItemView(layoutResId: Int, parent: ViewGroup): View {
val binding = DataBindingUtil.inflate(mLayoutInflater, layoutResId, parent, false)
?: return super.getItemView(layoutResId, parent)
val view = binding.root
view.setTag(R.id.BaseQuickAdapter_databinding_support, binding)
return view
}
class ListViewHolder(view: View) : BaseViewHolder(view) {
val binding: ViewDataBinding
get() = itemView.getTag(R.id.BaseQuickAdapter_databinding_support) as ViewDataBinding
}
}
我们在引入了 Brvah 这个框架之后可以做到让 Adapter 写的更少,它帮助我们进行和很大程度上的代码优化,而我们做的仅仅就是在基础之上去写一点东西,站在巨人的肩膀上也是舒服。如此一来我们就可以做到上文中的写法, 简单,快速的实现了你的一个列表。
伸手吧
工程代码 这也是我想弄的一个框架,但是没啥时间去写。。
总结
其实并不限于此,我想提出的是一个思想 一个方法,我们是不是可以在很多时候去这样行动,针对一些并不复杂,但是会比较占用时间的东西去优化,而不是一味的去写重复性的代码,做重复性的工作。毕竟这样的工作 任何人都可以,而我们是工程师。做的应该不仅仅于此。
如果您喜欢技术 热爱技术,并且不满足于现状 可以来一起吹比讨论,虽然时不时可能会聊一些技术,可以来这里啊:233138718