layout: post title: "多数情况下你的Adapter能够这样作" categories: [编程] tags: [Kotlin,Android] published: Truegit
平时对于一个这样的基本列表咱们都是作这样的几步github
// 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<T>(layout: Int, data: ObservableArrayList<T>, var brId: Int) :
BaseListAdapter<T>(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<T>(layout: Int, data: ObservableArrayList<T>?): BaseQuickAdapter<T, BaseListAdapter.ListViewHolder>(layout,data) {
init {
data?.addOnListChangedCallback(object :
ObservableList.OnListChangedCallback<ObservableList<String>>() {
override fun onChanged(sender: ObservableList<String>?) {
notifyDataSetChanged()
}
override fun onItemRangeRemoved( sender: ObservableList<String>?, positionStart: Int, itemCount: Int ) {
if (sender!!.isEmpty()) {
notifyDataSetChanged()
} else {
notifyItemRangeRemoved(positionStart, itemCount)
}
}
override fun onItemRangeMoved( sender: ObservableList<String>?, fromPosition: Int, toPosition: Int, itemCount: Int ) {
notifyItemMoved(fromPosition, toPosition)
}
override fun onItemRangeInserted( sender: ObservableList<String>?, positionStart: Int, itemCount: Int ) {
notifyItemRangeInserted(positionStart, itemCount)
}
override fun onItemRangeChanged( sender: ObservableList<String>?, positionStart: Int, itemCount: Int ) {
notifyItemRangeChanged(positionStart, itemCount)
}
})
}
override fun getItemView(layoutResId: Int, parent: ViewGroup): View {
val binding = DataBindingUtil.inflate<ViewDataBinding>(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 写的更少,它帮助咱们进行和很大程度上的代码优化,而咱们作的仅仅就是在基础之上去写一点东西,站在巨人的肩膀上也是舒服。如此一来咱们就能够作到上文中的写法, 简单,快速的实现了你的一个列表。架构
工程代码 这也是我想弄的一个框架,可是没啥时间去写。。框架
其实并不限于此,我想提出的是一个思想 一个方法,咱们是否是能够在不少时候去这样行动,针对一些并不复杂,可是会比较占用时间的东西去优化,而不是一味的去写重复性的代码,作重复性的工做。毕竟这样的工做 任何人均可以,而咱们是工程师。作的应该不单单于此。ide
若是您喜欢技术 热爱技术,而且不知足于现状 能够来一块儿吹比讨论,虽然时不时可能会聊一些技术,能够来这里啊:233138718布局