Android.輕松將層級復雜的數(shù)據(jù)展示在ListView/RecyclerView中

2017.2.22更新:現(xiàn)在有更好的實現(xiàn)方式,請看這篇文章:Android.輕松地將嵌套的數(shù)據(jù)展示在ListView和RecyclerView中(2)

它的實現(xiàn)方式依賴于此篇文章介紹的數(shù)據(jù)結(jié)構(gòu),感興趣的可以繼續(xù)看這篇文章,但內(nèi)容比較雷同,建議側(cè)重上面介紹的文章。

——————————————————————————————————————————————

以下為過去發(fā)表的內(nèi)容??????


大家都知道ListView和RecyclerView(為了簡便,以下都用ListView表示)都能用來展示一列數(shù)據(jù)。但是如果數(shù)據(jù)比較復雜,比如qq的好友列表,是分組展示的,每一組里又顯示一列好友,所以qq好友列表數(shù)據(jù)的層級是2,外層是分組,內(nèi)層是好友。這種層級為2的數(shù)據(jù)可以用ExpandableListView來展示,剛好ExpandableListView還可以收縮和展開。但是,ExpandableListView有其局限性,一是和ListView差別較大,兩者重構(gòu)起來比較麻煩。二是ExpandableListView只能展示兩層,遇到層級更復雜的數(shù)據(jù),就不太適用了。

我們經(jīng)常需要將層級復雜的數(shù)據(jù)展示到ListView中,拋開ExpandableListView,通常的做法是層層遍歷,按按順序?qū)?shù)據(jù)添加到列表或者數(shù)組中,這樣,層級結(jié)構(gòu)的數(shù)據(jù)就被展平了,可以方便地顯示在ListView中。這是非常直觀的做法,但仍有局限性。一是展平后的數(shù)據(jù)和原始數(shù)據(jù)失去了關(guān)聯(lián),如果單純的展示數(shù)據(jù)還好,如果需要操作數(shù)據(jù),比如,qq好友列表的例子中,要將某組好友中的某個好友在該組中置頂,或者展開(收縮)某一組好友,操作起來就比較麻煩;二是展示復雜數(shù)據(jù)的場景太多了,經(jīng)常為特定的場景寫類似的代碼很麻煩,而且數(shù)據(jù)不同,寫法也不一樣,每次都要為類似的事情重新構(gòu)思,是不是很煩?

所以,就需要一套框架,來將層級復雜的數(shù)據(jù)映射到列表中。其實,這種分層級的數(shù)據(jù)就是樹狀數(shù)據(jù)。而我的想法也很簡單,就是能不能有一種樹,它自帶索引,這個索引能按以上提到的列表的順序訪問這顆樹的節(jié)點。而我們需要做的僅是構(gòu)造和我們的數(shù)據(jù)的層級結(jié)構(gòu)相同的樹,并把數(shù)據(jù)填到樹的對應(yīng)的節(jié)點中,然后用索引來訪問樹并展示數(shù)據(jù)。這樣,無論數(shù)據(jù)的層級如何,操作都很相似,并且,保留了數(shù)據(jù)的結(jié)構(gòu)。

以下談?wù)労喴膶崿F(xiàn)方式:

用一個Node類表示樹節(jié)點,用來構(gòu)造樹,Node類需要維護一個int類型的數(shù)量,表示這個節(jié)點包含的子節(jié)點數(shù)(包括子節(jié)點的子節(jié)點的子節(jié)點..,也就是節(jié)點展平后的數(shù)量),這樣,就能方便地在索引中添加和刪除節(jié)點的引用了(因為在索引中添加和刪除節(jié)點需要同時處理其子節(jié)點)。

具體的實現(xiàn)可以看源代碼,注釋比較詳細。實現(xiàn)了一些有用的功能,比如展開,收縮和隱藏節(jié)點,因此可以在ListView中的任意地方收縮和展開,比ExpandableListView強大。代碼持續(xù)完善中。

貼出一張用這個框架實現(xiàn)的demo的效果圖:


框架源代碼:https://github.com/jack-cook/LinearTree

demo代碼:https://github.com/jack-cook/HierarchicalViewSample

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

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

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