Android樹形控件

Android樹形控件  

     最近公司需要做一個樹形圖的效果(就是上面gif圖),本來應該是後臺傳給我已經分好層級的json數據。但是他們所謂的已經分好的層級就是每個元素都有id(結點本身)和pid(父結點)這兩個屬性。我竟無言以對。因爲這兩個屬性確實分好了層級。   下面分析一下實現思路: >1.對數據進行排序(處理數據),如下圖:   

後臺傳給我的數據其實是無序的,我需要根據結點的id和pid進行排序。將結點處理成上圖所示的順序。
  
對於數據的處理,我的思路是這樣的:  

var rootNodes = mutableListOf<NodeBean>()
var idListMap = mutableMapOf<String, MutableList<String>>()
var allNodeMap = mutableMapOf<String, NodeBean>()

1.根結點的pid是沒有值的

2.結點的pid就是父結點的id

3.對數據進行遍歷,如果元素的pid沒有值。存入rootNodes集合中

4.pid有值,在idListMap中使用pid進行查找。即idListMap?.get(pid)

5.返回的值不爲null,說明Map中有這個元素。即得到了idList

6.將當前結點的id存入idList當中

7.第4步中返回的是null,則創建一個idList,將當前結點的id存入idList中。然後以當前結點的pid爲key,idList爲value存入idListMap中

8.以當前結點的id爲key,結點本身(JavaBean)爲value存入allNodeMap中

9.在循環中重複4-8,直到便利完所有的元素

當循環結束之後,我們得到了三樣東西:

rootNodes:一個List集合,保存着所有的根節點
idListMap:一個Map集合,存放着節點的id和該結點所有子節點的id
allNodeMap:一個Map集合,所有的節點id及其對應的JavaBean

數據已經處理完了,剩下的就是排序了。這裏的排序涉及到遞歸算法。

var allNodes: MutableList<NodeBean> = mutableListOf<NodeBean>()

1.遍歷rootNodes

2.根據根節點的id從allNodeMap中直接get到根節點的JavaBean,放入allNodes中

3.根據根節點的id在idListMap中 ,直接get到idList。拿到所有子結點的id

4.遍歷idList,根據id從allNodeMap直接get到id對應結點的JavaBean。放入allNodes中

5.以拿到的子節點爲根節點,重複2,3,4操作(遞歸)。直到找到葉子結點爲止。

6.在第3步中已經進入了遞歸算法,因爲不知道哪個結點纔是葉子結點,所以需要用到遞歸算法

發佈了69 篇原創文章 · 獲贊 14 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章