Android树形控件
后台传给我的数据其实是无序的,我需要根据结点的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步中已经进入了递归算法,因为不知道哪个结点才是叶子结点,所以需要用到递归算法