作者簡介? 原創(chuàng)微信公眾號鴻洋 WeChat ID: hongyangAndroid
現(xiàn)在在實際開發(fā)中询张,越來越多的人選擇RecyclerView來實現(xiàn)列表布局读处,而RecyclerView寫多了,每次都要直接繼承Adapter實現(xiàn)onCreateViewHolder骂维、onBindViewHolder磕诊、getItemCount這三個方法,雖然代碼量不算很大肠仪,但每個XXXAdapter其實都長得差不多,這種重復性的代碼建钥,開發(fā)者是最不想寫的了藤韵,所以網(wǎng)上就出現(xiàn)了很多封裝Adapter的開源庫。
所以本篇文章也介紹自己封裝的一個Adapter熊经,幫你快速高效的添加一個列表(包括單Item列表和多Item列表)泽艘。
先簡單看一下最終效果:
而Adapter的代碼量極少,感受一下:
嗯镐依,沒錯匹涮,你只需要實現(xiàn)bind方法就可以了,而bind方法是用來設置View的一些一次性設置的槐壳,例如開啟響應點擊事件然低,長按事件等。所以上面我就什么都沒寫。
實現(xiàn)一個通用的Adapter模版雳攘,避免寫Adapter中大量的重復代碼带兜,抽象出幾個接口。
通過讓數(shù)據(jù)類實現(xiàn)IMultiItem接口吨灭,把部分Adapter中的代碼轉(zhuǎn)移到具體的數(shù)據(jù)類中刚照,而不用在Adapter去判斷數(shù)據(jù)類型和ViewType。這樣很容易添加新的Item(ViewType)類型,減少耦合喧兄,Adapter不用去感知IMultiItem的具體類型无畔。
高內(nèi)聚,低耦合吠冤,方便擴展浑彰。
封裝ViewHolder,將對View的常用操作都加上去拯辙。
2
實現(xiàn)
我們先看一下BaseViewHolder:BaseViewHolder封裝了我們一些常用的操作郭变,例如獲取子View,設置item的點擊事件薄风,設置item的子View響應點擊事件等饵较。獲取子View我用了Object[]數(shù)組進行緩存,沒有用SparseArray來緩存View遭赂,主要是我之前看了Agera的源碼循诉,所以才用這種方式來緩存的,這里按下不表撇他,下面是BaseAdapter的部分代碼:
接下來我們來看一下BaseMultiAdapter里面做了什么茄猫?
是不是發(fā)現(xiàn)這里面也很少代碼,因為很大一部分代碼都在BaseAdapter中實現(xiàn)了困肩,
這里我們發(fā)現(xiàn)了一個IMultiItem,我們看一下它倆的源代碼:
BaseAdapter的代碼如下:
看到這里我們就能發(fā)現(xiàn)了划纽,BaseAdapter已經(jīng)寫了大部分的代碼,就留下getLayoutRes,convert,bind給子類去實現(xiàn)锌畸,而它的子類BaseMultiAdapter直接把getLayoutRes和convert丟給了IMultiItem去實現(xiàn)勇劣。
getLayoutRes是返回item對應的布局文件id,同時它在BaseAdapter也作為ViewType來使用潭枣,所以如果是不同類型的item,不建議共用同個布局文件比默。
所以,我們的數(shù)據(jù)類只要實現(xiàn)IMultiItem接口即可盆犁,例如上面的文本類item:
把getLayoutRes跟convert交給IMultiItem處理的好處就是實現(xiàn)多布局列表變得很簡單命咐,數(shù)據(jù)各自對應自己的布局文件,自己在convert方法中顯示數(shù)據(jù)谐岁。
上面的具體全部代碼在都在我的開源庫里醋奠,一個封裝了RecyclerView.Adapter一些常用功能的庫:
https://github.com/EvilBT/SherlockAdapter