在ListView中展示嵌套的數(shù)據(jù)是非常常見的,比如QQ的好友列表村砂,外部是分組烂斋,分組里嵌套著好友列表。這種二級的嵌套數(shù)據(jù)可以用ExpandableListView展示础废,但是如果是三級或者更深的嵌套層級源祈,ExpandableListView就不適用了。那么如何實(shí)現(xiàn)呢色迂?
通常的做法是自己編寫數(shù)據(jù)結(jié)構(gòu)香缺,將嵌套的數(shù)據(jù)映射到列表中,再將列表展示到ListView中歇僧。但是這樣做會讓代碼依賴于需求图张,比較難維護(hù),并且不同的場景需要編寫不同的實(shí)現(xiàn)方式诈悍。
ListView的使用方式很簡單祸轮,程序員告訴ListView要展示的列表的長度及列表各位置的數(shù)據(jù)。類似地侥钳,如果能告訴ListView更多的信息适袜,如列表某個位置的數(shù)據(jù)嵌套了另一個列表,讓ListView去遞歸地獲取更深層次的信息并展示就好了舷夺。然而ListView并不具有這樣的功能苦酱。不過別擔(dān)心售貌,我們可以擴(kuò)展ListView的Adapter,讓Adapter具備這樣的能力疫萤,這樣颂跨,只要需要展現(xiàn)嵌套的數(shù)據(jù),使用這樣的Adapter就可以了扯饶,無需煩惱數(shù)據(jù)結(jié)構(gòu)到列表的映射恒削。
那么如何實(shí)現(xiàn)這樣的Adapter呢?Adapter需要提供接口尾序,讓程序員告訴它數(shù)據(jù)的層級關(guān)系钓丰,然后內(nèi)部維護(hù)一個列表代表對嵌套數(shù)據(jù)的映射。ListView真正使用的是這個內(nèi)部列表每币,我們只是擴(kuò)展了Adapter讓其更懂我們數(shù)據(jù)的結(jié)構(gòu)携丁。
以下是這種Adapter的一種具體實(shí)現(xiàn)的代碼,適用于ListView和RecyclerView脯爪。
值得一提的是则北,這種實(shí)現(xiàn)同時具有展開和收縮節(jié)點(diǎn)的功能矿微,不限于節(jié)點(diǎn)的層級痕慢,只需要動態(tài)地告訴Adapter某一節(jié)點(diǎn)的列表長度為真實(shí)長度或者欺騙它,告訴它長度為0.
PreOrderTreeAdapter內(nèi)部映射數(shù)據(jù)到列表的實(shí)現(xiàn)方式在我的另外一篇文章中有介紹:www.reibang.com/p/6e0d76dc16fa
跟這篇文章比較相似涌矢,沒有必要再看掖举,感興趣可以直接看其代碼實(shí)現(xiàn):LinearTree