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步中已經進入了遞歸算法,因爲不知道哪個結點纔是葉子結點,所以需要用到遞歸算法