1:簡介
Android開發(fā)中ListView經(jīng)常會被用到,而和BaseAdapter搭配使用也是一種常用的選擇。但由于重寫B(tài)aseAdapter需要實現(xiàn)過多的抽象方法单绑,會導(dǎo)致代碼很長很冗余很不美觀嗦董。于是自己寫了個抽象類EasyAdapter繼承BaseAdaper以及一個ViewHolder抽象類EasyHolder(ViewHolder相信不用解釋大家也知道)若治,兩個類搭配使用以盡可能的減少代碼的重復(fù)居兆。
2:以前怎么寫
讓我們先看一下最原始的ListView加BaseAdapter的寫法:
我們來看一下惰许,哪些代碼是冗余的,即不需要每次都寫史辙。
1:首先是BaseAdapter的三個抽象方法getCount(),getItem()佩伤,getItemId()聊倔,一般情況下他們的邏輯沒什么多大變動,所以可以認(rèn)為是冗余的生巡。
2:考慮一種情況耙蔑,有兩個頁面均使用ListView,且item布局可以共用孤荣。如果重寫一遍上面代碼就太煩了甸陌,兩者唯一不同也就是標(biāo)記1部分的代碼须揣,即更新顯示內(nèi)容的代碼。所以可以認(rèn)為在此情況下標(biāo)記2和標(biāo)記3處代碼冗余钱豁。
3:再考慮一種情況耻卡,這種情況可能用到比較少。還是有兩個頁面均使用ListView牲尺,且兩者item布局唯一不同之處就是組件布局不同卵酪,其他均一樣(包括組件個數(shù),組件id以及標(biāo)記1代碼部分邏輯)谤碳,此時如果重新寫一個BaseAdapter就更吃虧了溃卡,因為唯一不同之處就是標(biāo)記3處一行代碼,連標(biāo)記2處代碼兩者都是一樣的蜒简,因為剛才說了組件個數(shù)和id都一樣瘸羡。所以可以進(jìn)一步認(rèn)為在此情況下標(biāo)記2處冗余和標(biāo)記3處冗余可以進(jìn)一步細(xì)分。
3:現(xiàn)在怎么寫
我新建了一個抽象類EasyHolder和一個繼承BaseAdapter的抽象類EasyAdapter搓茬,下面將從上述三個冗余點著手分析這兩個類犹赖。
3.1:EasyHolder類
1:針對冗余1,實現(xiàn)getCount()垮兑,getItem()冷尉,getItemId()的默認(rèn)邏輯即可
2:針對冗余2和冗余3,我創(chuàng)建了一個EasyHolder抽象類系枪,代碼如下:
該類設(shè)有三個抽象方法雀哨,分別對應(yīng)代碼2-1中的三個標(biāo)記點。標(biāo)記3處代碼對應(yīng)getLayout()方法私爷,標(biāo)記2處代碼對應(yīng)createView()方法雾棺,標(biāo)記3處代碼對應(yīng)refreshView()方法。
3.2:EasyAdapter代碼如下:
該類提供了冗余1的默認(rèn)實現(xiàn)衬浑。用戶只需實現(xiàn)getHolder()這一抽象方法即可捌浩,其中type可用于ListView多類型時使用,單類型可忽略工秩。
4:舉個栗子
4.1:栗子1(單類型)
4.1.1:準(zhǔn)備
ListView的item布局item_person.xml如下尸饺,設(shè)有兩個TextView:
設(shè)置一Bean類Person,設(shè)有三個屬性name助币、sex和type浪听,其中name和sex對應(yīng)item_person.xml中兩個TextView的顯示內(nèi)容,type將在下面第二個例子ListView多類型處使用:
4.1.2:繼承EasyHolder
可以發(fā)現(xiàn)代碼2-1中代碼其實是被分布到了上面三個方法中眉菱。
4.1.3:設(shè)置Adapter
4.1.4:運行效果
4.2栗子2(多類型)
4.2.1:準(zhǔn)備
在單類型基礎(chǔ)上新增一個布局item_child.xml迹栓,如下圖,該布局和item_parent.xml唯一不同就是組件排列方向不同俭缓,其他均一樣克伊,包括id酥郭。
新增一Bean類Child,該類繼承Parent類愿吹,唯一不同就是type的值不从,該值用來區(qū)分ListView中item的類型:
4.2.2:繼承EasyHolder,因其特殊性(符合冗余3)洗搂,即唯一不同就是標(biāo)記3處消返,所以只需重寫getLayout()方法即可:
4.2.3:設(shè)置Adapter
其中g(shù)etItemType具體邏輯不再贅述,getHolder只需根據(jù)type傳入相應(yīng)的EasyHolder即可。
4.2.4:運行效果圖
5:最后附上Demo下載地址:
https://github.com/VolodymyrCj/workspace/tree/master/as_workspace/EasyAdapter。