多數情況下你的Adapter能夠這樣作


layout: post title: "多數情況下你的Adapter能夠這樣作" categories: [編程] tags: [Kotlin,Android] published: Truegit


前提條件

  1. MVVM 架構
  2. 不須要子 View 點擊,僅僅是 item 的點擊事件
  3. dataBinding 使用
  4. Brvah Adapter框架(非必須) 有他會讓你更舒服

日常寫法

平時對於一個這樣的基本列表咱們都是作這樣的幾步github

  1. xml 中寫一個 RecyclerView
  2. 寫出對應的 Item 佈局
  3. 新建一個 Adapter 類 而且在裏面進行 數據綁定 ViewHolder建立 等等基本操做....
  4. 最後在 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<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佈局

相關文章
相關標籤/搜索