添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
當您輸入電子信箱、訂閱本公司之「電子報」時,我們會向您蒐集、處理、利用的個資為您的「電子信箱」以及「提交日期」,當您輸入電子信箱並送出時,即表示您同意我們使用您的個資,為保障您的權益,關於更多相關政策更新資訊,請務必閱讀我們的「 隱私權政策 」、「 使用條款 」及「 免責聲明 」。如您不同意本網站之「隱私權政策」、「使用條款」及「 免責聲明」,您可以隨時「 取消訂閱 」,謝謝您。

開發 APP 時,在需要顯示大量資訊但顯示項目外觀有著些許不同或是多個區塊時,常常會遇到一個問題是:『這個頁面我要不要重複使用內容?』

數量少的時候可能會選擇使用 ScrollView 然後內容寫死,數量多的時候可能會用多個 Recyclerview 或是透過 ViewType 區分並且混用多個 ViewHolder ,不過在這個情況下的 Adapter 通常需要塞入大量的程式碼處理不同類型的 itemView

針對這類有順序且區塊分明的內容, Google 推出了新元件 ConcatAdapter ,並在今年四月 Recyclerview 推出 1.2.0 版時,正式包含在套件裡面。

ConcatAdapter 顧名思義,就是將 Adapter 連接起來的 Adapter ,允許你在同一個 Recyclerview 同時使用多個 Adapter

- 最低版本限制

- 內容分類

- 建立 ViewHolder

- 建立 Recyclerview Adapter

- 使用 ConcatAdapter

- 關於 ConcatAdapter.Config isolateViewTypes

範例原始碼

使用上僅需跟 Recyclerview 同時加入,並指定版本為 1.2.0 以上,請在 app build.gradle 檔案的 dependencies 區塊內添加:

implementation("androidx.recyclerview:recyclerview:1.2.0")

最低版本限制

根據 CommonsWare 所維護的 AndroidX 套件資訊列表, Recyclerview 1.2.0 套件的 minSdkVersion (api level) 14 ,也就是 Android 4.0

底下我們會實作一個 Demo APP ,假設有個畫面需求如上圖所示,顯示產品圖片、產品名稱、產品價格、產品規格以及特色說明。圖上的做法是完全使用 ScrollView LinearLayout TextView ImageView 寫死內容,對於規格已經相當確定且不太會變動的頁面使用這樣的方法尚可接受,不過如果如果要保持擴充彈性建議還是不使用這樣的方法製作,一方面是 xml layout 檔案內會相當雜亂冗長,接下來我們會將這個畫面改成使用 ConcatAdapter 實作。

畫面上可以很簡單分出幾個區塊,包含只有單一項目的產品圖片、產品標題 ( 名稱與價格 ) ,還有比較多個項目的產品規格與特色說明,這邊就直接拆成 4 Adapter 去負責個別區塊的內容。

建立 ViewHolder

商品圖片就只放入一個 ImageView 顯示商品圖片。

標題部分放上產品名稱跟價格文字。

規格部分只放一組文字。

特色說明部分有一張圖片跟說明文字。

建立 Recyclerview Adapter

首先為四個區塊分別產生對應的 Adapter ViewHolder

資料來源直接使用 arrays 資源檔處理,標題部分算是比較偷吃步,直接用一個項目包含兩個資料,底下的 Adapter 因此可以再簡化。

首先建立商品圖片來源 ProductImageAdapter ,圖片部分使用字串取回圖片 Resource ID 再進行套用

接著建立產品標題來源 ProductTitleAdapter

建立產品規格來源 ProductSpecAdapter

建立產品特色來源 ProductFeatureAdapter

使用 ConcatAdapter

ConcatAdapter 的使用方法其實相當簡單,可以直接傳入 List<Adapter> ,或是將 Adapter 一個接一個帶入。

回到專案原始碼,新增一個 ProductActivity xml layout 部分只擺上一個填滿畫面的 Recyclerview

接著使用字串陣列資源建立每個區塊的 Recyclerview Adapter 後,新增一個 ConcatAdapter 並按照畫面上的順序將每一個區塊的 Adapter 填入,並且指定給 Recyclerview 使用。

Recyclerview | Android Developers

https://developer.android.com/jetpack/androidx/releases/recyclerview#recyclerview-1.2.0

ConcatAdapter | Android Developers

https://developer.android.com/reference/kotlin/androidx/recyclerview/widget/ConcatAdapter

ConcatAdapter.Config | Android Developers

https://developer.android.com/reference/kotlin/androidx/recyclerview/widget/ConcatAdapter.Config

AndroidX Tech: androidx.recyclerview:recyclerview

https://androidx.tech/artifacts/recyclerview/recyclerview/1.2.0

Concatenate adapters sequentially with ConcatAdapter

https://medium.com/androiddevelopers/merge-adapters-sequentially-with-mergeadapter-294d2942127a

Android 新發布的 ConcatAdapter 使用教程

https://juejin.cn/post/6962754669756022791

範例原始碼

GitHub

https://github.com/foxtsai2333/ConcatAdapterDemo