上一次我們學(xué)會了使用ListView以及對它進行優(yōu)化啊送,那么今天我們來學(xué)一下跟ListView特別像的一個控件,ExpandableListView帽芽。
跟ExpandableListView跟ListView名字就很像删掀,多了一個Expand,是可拉伸的意思导街。ListView是一個一級列表,他是一個二級列表纤子,話不多說搬瑰,我們來看一下他的效果:
首先顯示第幾組是一級列表,點開以后是里面的數(shù)據(jù)控硼,也就是二級列表≡舐郏現(xiàn)在大家應(yīng)該知道這個是什么意思了吧。
因為ExpandableListView和ListView太像了卡乾,所以就不一步一步地跟大家做了翼悴,我說一下流程和幾個關(guān)鍵的步驟:
1.在.xml文件中添加一個標(biāo)簽<ExpandableListView,然后給上Id
2.在Activiy中創(chuàng)建ExpandableListView對象幔妨,通過findViewById查找到對應(yīng)控件鹦赎。
3.創(chuàng)建數(shù)據(jù)(是ExpandableListView的適配器接收的數(shù)據(jù)),一般來說我們用Map嵌套List的數(shù)據(jù)類型作為適配器的數(shù)據(jù)误堡。
4.創(chuàng)建適配器類古话,注意我們ExpandableListView的適配器所繼承的類不是BaseAdapter,而是BaseExpandableListAdapter锁施,
隨后在里面實現(xiàn)方法陪踩。但是我們會發(fā)現(xiàn)杖们,這個適配器實現(xiàn)的方法遠遠比BaseAdapter實現(xiàn)的方法要多得多,我們來一個一個看一下:
首先這兩個分別是獲取到組的個數(shù)(就像上面我們看到的一共有多少個一級列表)肩狂,和獲取到某個組的子選項的個數(shù)(某個一級列表有多少個數(shù)據(jù))摘完。
這兩個是獲取我們的某一個組條目和獲取某一個子條目,
這兩個是獲取組的Id和獲取某一組的子條目的Id
這個方法我們暫時不說傻谁,因為使用的話暫時不用了解孝治,等以后分析ExpandableListView的時候再說。
這個方法是我們的子條目是否可點擊栅螟,如果返回false荆秦,則無法點擊,就是子條目的點擊事件無法被調(diào)用力图,返回true則恰恰相反步绸。
而我們今天主要看的、主要寫的就是這兩個方法:獲取組視圖和獲取某一個組視圖的子視圖吃媒。
現(xiàn)在我們來簡單實現(xiàn)一下瓤介。
由于我們把Adapter接收的數(shù)據(jù)源類型設(shè)置為Map嵌套List,所以我們要在構(gòu)造器(Adapter)里面創(chuàng)建一個Map類型對象來接收數(shù)據(jù)赘那。當(dāng)然還不能少了一個很重要的屬性:上下文(Context)
沒問題對吧刑桑,現(xiàn)在我們來想一個問題:我們接收的數(shù)據(jù)類型為Map嵌套List,也就是說我們把Map的Key值當(dāng)成一級列表的名字募舟,把每個Key儲存的value(List類型)當(dāng)做二級列表祠斧。這個應(yīng)該可以理解吧。
但是我們都知道HaspMap是無序的拱礁,我們上面的各種方法的參數(shù)大多數(shù)都是position琢锋,也就是坐標(biāo),但是對于一個無序的Map是無法通過position來找到對應(yīng)的value呢灶。所以在這之前我們要先做一點手腳:我們在適配器里面再創(chuàng)建一個List對象矩欠,用來存儲 把Map的key值轉(zhuǎn)化為的List应又。這樣我們就可以通過List蜕煌,得到對應(yīng)position的key值玄呛,進而得到二級列表。我們來演示一下缨睡。
我們在適配器中添加了一個用于存儲key的list鸟悴,至于這個list的數(shù)據(jù),我們在Activity中給它傳入就好宏蛉。(這個我們等會兒在寫)遣臼。
在getGroupCount方法中,我們傳入了map的size拾并,這個大家都能看懂揍堰。
在getChildrenCount方法中鹏浅,我們傳入通過keyList和groupPosition得到了對應(yīng)位置的key值,然后得到了對應(yīng)的value(List類型)屏歹,最后得到了list的size隐砸。
這兩個方法跟上面的兩個很像,大家應(yīng)該可以看懂蝙眶。
傳入Id的方法季希,還是跟BaseAdapter一樣,吧對應(yīng)的參數(shù)返回就好幽纷。下面我們來看一看最重要的兩個方法:大家還記得我們當(dāng)時是怎么優(yōu)化BaseAdapter的嗎式塌,我們創(chuàng)建了一個ViewHolder的對象用來接收已經(jīng)加載過的布局的控件,而這里我們是有二級列表友浸,所以我們需要兩個ViewHolder峰尝。
我們使用的是最簡單的數(shù)據(jù)類型,所以直接就是兩個TextView收恢。
跟BaseAdapter一樣的邏輯武学,只是大家注意我們在給tv.setText時傳入了key值。
我們在childholder傳入值時候伦意,首先通過keyList獲取了map的key值火窒,然后獲取了子條目。
好了驮肉,現(xiàn)在我們的適配器就配置完了熏矿,下面我們來寫我們的Activity界面。
init為初始化方法离钝,bean為假數(shù)據(jù)添加方法曲掰。
KeyList為把key存入到List中的方法。
最后我們來看一下效果: