當您輸入電子信箱、訂閱本公司之「電子報」時,我們會向您蒐集、處理、利用的個資為您的「電子信箱」以及「提交日期」,當您輸入電子信箱並送出時,即表示您同意我們使用您的個資,為保障您的權益,關於更多相關政策更新資訊,請務必閱讀我們的「
隱私權政策
」、「
使用條款
」及「
免責聲明
」。如您不同意本網站之「隱私權政策」、「使用條款」及「 免責聲明」,您可以隨時「
取消訂閱
」,謝謝您。
開發
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