<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MultiType開源項目源碼分析

          共 2612字,需瀏覽 6分鐘

           ·

          2021-04-23 21:50

          PS:前兩天有事,路過大學特意進去看了一下,熟悉的場景不熟悉的人,時隔幾年,再也回不去了。
          先看下該項目作者的介紹,MultiType 就是一個多類型列表視圖的中間分發(fā)框架,它能幫助你快速并且清晰地開發(fā)一些復雜的列表頁面,數(shù)據(jù)驅(qū)動視圖,支持布局類型和 viewBinder 一對一及 一對多的關(guān)系綁定、面向接口編程,MultiType 將視圖創(chuàng)建、數(shù)據(jù)填充的工作委托給了 ItemViewBinder,ItemViewBinder 對應要填充的數(shù)據(jù)類型 T 和 ViewHolder,后續(xù)不同的數(shù)據(jù)類型都需實現(xiàn)對應的 ItemViewBinder,項目地址如下:
          https://github.com/drakeet/MultiType
          將從以下幾個方面學習 MultiType 的源碼:
          1. MultiTypeAdapter的使用

          2. MultiTypeAdapter的register過程

          3. MultiTypeAdapter的ViewHolder和數(shù)據(jù)填充

          MultiTypeAdapter的使用

          簡單看下 MultiTypeAdapter 寫法上與普通 Adapter 上的不同,如下:
          1// base
          2adapter.register(TextItemViewDelegate())
          3adapter.register(ImageItemViewDelegate())
          4adapter.register(RichItemViewDelegate())
          5// One to many
          6adapter.register(Data::class).to(
          7  DataType1ViewDelegate(),
          8  DataType2ViewDelegate()
          9).withKotlinClassLinker { _, data ->
          10  when (data.type) {
          11    Data.TYPE_2 -> DataType2ViewDelegate::class
          12    else -> DataType1ViewDelegate::class
          13  }
          14}
          15adapter.items = items
          16recyclerView.adapter = adapter
          17adapter.notifyDataSetChanged()
          具體細節(jié)這里不再贅述,具體可以移步去前面地址查看。

          MultiTypeAdapter的register過程

          MultiTypeAdapter 的 register 過程主要是將 Type 類型添加到 MultiTypeAdapter 對應的集合中,以供后續(xù)使用,調(diào)用過程如下:
          下面看下 MultiTypeAdapter一對多關(guān)系的register過程:
          如上第 10 步又換回到了一對一的注冊流程上了。

          MultiTypeAdapter的ViewHolder和數(shù)據(jù)填充

          上一小結(jié) MultiTypeAdapter 主要是將原本 RecyclerView.Adapter 中的方法委托到了 ItemViewBinder 具體的子類實現(xiàn)中,并將具體的 ItemViewBinder、Linker、數(shù)據(jù)類型 T 的 Class 信息以 Type 的形式添加到 MultiTypeAdapter 中的類型集合中,其 Item 類型、ViewHolder 創(chuàng)建、數(shù)據(jù)填充都需通過具體的 ItemViewBinder 的子類實現(xiàn),下面將詳細探究這一過程。
          getItemViewType
          getItemViewType 用來返回 Item 的視圖類型,MultiTypeAdapter 中的 getItemViewType 返回的視圖類型索引是 MutableTypes 中對應 Type 的索引,調(diào)用流程如下:
          從上面可知最終返回的視圖類型的索引為 index+linker.index,從源碼可知在一對一的情況下使用的是 DefaultLinker,其默認的 index 是 0,所以最終返回的視圖類型的索引就是 MutableTypes 中對應 Type 的索引 index。
          onCreateViewHolder
          onCreateViewHolder 用來根據(jù)布局文件創(chuàng)建生成 ViewHolder,具體調(diào)用流程如下:
          onBindViewHolder
          onBindViewHolder 也是同理都是從添加的類型的集合中獲取對應的委托的 ItemViewDelete 進行處理。
          簡單總結(jié)一下,上面這種使用方式就是將原來的 Recycler.Adapter 中的一些方法委托到了 ItemnViewDelegate 中,每種 Item 類型都添加到 MutableTypes 中的類型集合 types 中,具體實現(xiàn)則從委托的具體實現(xiàn)類中完成。

          總結(jié)

          簡單總結(jié)下,將顯示的 Item 的類型以 ItemViewBinder 的方式抽取出去,降低了不同 Item 的類型之間的耦合。使得可以隨時添加 Item 的類型而無需修改 Adapter,只需添加新的 ItemViewBinder 的實現(xiàn)類即可。
          作者提到的“一對多”的關(guān)系主要是同一個 Item 的類型對應多個布局實現(xiàn),主要是學習作者代碼思路,面向接口編程。個人理解 MultiTypeAdapter 相當于是對 RecyclerView.Adapter 的擴展而不是對其的封裝,自己使用可以進一步封裝。
          推薦閱讀:
          瀏覽 89
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰大逼| 午夜福利电影在线免费观看 | 亚洲AV无码一区 | 深爱五月丁香婷婷 | 免费①区二区三区四区 |