每日Android源碼設(shè)計(jì)模式之-19、適配器模式

適配器模式我們很常見(jiàn)了,ListView的Adapter就是一個(gè)適配器。

不過(guò)ListView的Adapter是用來(lái)對(duì)數(shù)據(jù)進(jìn)行適配,而傳統(tǒng)的適配器模式一般是對(duì)兩個(gè)類(lèi)的不同接口進(jìn)行兼容。


定義:

把一個(gè)類(lèi)的接口變換成客戶(hù)端所期待的另一種接口,從而使因?yàn)榻涌诓黄ヅ涠椒ピ谝黄鸸ぷ鞯膬蓚€(gè)類(lèi)能夠在一起工作。


簡(jiǎn)單實(shí)現(xiàn)

適配器模式分類(lèi)兩種:1.類(lèi)適配器模式。 2.對(duì)象適配器模式。

這里舉一個(gè)電源轉(zhuǎn)換的例子,比如我們的電腦一般需要輸入5V的電壓,而家用插座為220V。

1.類(lèi)適配器模式

需要被適配的類(lèi)Volt220里面有一個(gè)getVolt220方法返回220。

適配類(lèi)VoltAdapter繼承了Volt220類(lèi),實(shí)現(xiàn)了5Volt接口。

5Volt接口里面有個(gè)抽象方法 getVolt5.

VoltAdapter里面實(shí)現(xiàn)具體的getVolt5方法。

于是客戶(hù)端就可以通過(guò)voltAdapter.getVolt5方法來(lái)獲得5V電壓了。


2.對(duì)象適配器模式。

對(duì)象適配器模式中的VoltAdapter不繼承Volt220類(lèi),而是在構(gòu)造函數(shù)中傳入Volt220類(lèi)的對(duì)象,這樣的好處就是由于不是繼承關(guān)系,VoltAdapter類(lèi)隱藏了Volt220類(lèi)的方法細(xì)節(jié),讓用戶(hù)只能看到VoltAdapter中裝換后的方法,提高了封裝性。


Android中的適配器

就是ListView,GridView,RecyclerView中的Adapter。

因?yàn)槲覀兊臄?shù)據(jù),view,千變?nèi)f化,所以用Adapter來(lái)進(jìn)行適配。

通過(guò)Adapter中的getCount,getView,getItem等方法,來(lái)獲取數(shù)量、布局、數(shù)據(jù)等。

ListView中Adapter工作的簡(jiǎn)單流程:

Adapter是在ListView的父類(lèi)AbsListView中的。

當(dāng)關(guān)聯(lián)到Window時(shí),會(huì)調(diào)用AbsListView的onAttachedToWindow方法,方法里面給Adapter增加了觀察者,并且通過(guò)mAdapter.getCount()來(lái)獲取了Item的數(shù)量。

在AbsListView的onLayout方法中調(diào)用了layoutChindren(),實(shí)現(xiàn)在子類(lèi)中,根據(jù)布局模式是LAYOUT_FORCE_BOTTOM或者LAYOUT_FORCE_TOP調(diào)用fillUP或者fillDown方法。兩個(gè)方法都調(diào)用了makeAndAddView方法。

makeAndAddView方法中又通過(guò)obtainView(position,mIsScrap)來(lái)獲取具體的子ItemView。

obtainView方法中先通過(guò)mRecycler.getScrapView(position)來(lái)獲取緩存復(fù)用的scrapView。

如果緩存的scrapView為null就調(diào)用mAdapter.getView(position,null,this)否則調(diào)用mAdapter.getView(position,scrapView,this);

這里大家就再熟悉不過(guò)了。就是我們自己具體實(shí)現(xiàn)Adapter的getView方法。

mAdapter.getView返回一個(gè)child的View,這個(gè)就是我們具體的ItemView了。


優(yōu)點(diǎn):

增加了復(fù)用性

更好的擴(kuò)展性

缺點(diǎn):

讓系統(tǒng)變得凌亂,不易把握整體,例如你調(diào)用了方法A,但是在適配器顳部卻轉(zhuǎn)化成了方法B的實(shí)現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容