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佈局