1. 摘要
走查主题:Android 多级ListView的设计与实现
主讲人员:王凯伟
参加人员:杨龙、万峥嵘、汪洋。
走查时间:2017年6月23日星期五下午16:00到17:30
走查地点:公司负一楼
2. 走查内容
2.1常规做法
ListView为多级的显示方式,与此类似的有文件系统、省市区分级等等,类似于B树。最新效果图如下:
其中通过Adapter适配到ListView上的数据结构大致如下:
2.2一般会有两种数据存储形式
A. 通过索引连接树的节点:
某一点通过索引将所有点联系,类似于链表,任何两点间没有直接关系,如果要得到某个点需要算法和当前表/总表来遍历。存储效率高但遍历较耗时。
<B. 直接连接树的节点:
某一点通过实体类联系所有点,类似于多个数组,任何两点之间都有关系,任何一点都是一个树,如果需要得到某个点,只需要通过算法遍历subLayer/parentLayer即可。占用额外内存但遍历快速(只需要遍历List)。
2.3 当前做法
当前数据结构采用的是A;
2.3.1 之前显示效果:
当点击某一点时,跳到该点下一级并显示其所有layer层以上的节点。点击退回上一级时,显示当前节点的父节点的父节点的下一级所有layer层以上的子节点。
2.3.2 现在的显示效果:
A. 当点击某一点时,判断其展开状态:
如果当前节点是展开状态,将当前节点展开状态设置为false;
获取当前节点的所有下一级子节点并设置子节点状态为false(关闭),并将获取到的所有子节点从当前显示的列表中删除(根据Id删除);
从当前节点开始逐级向上遍历,在每一级如果当前节点的父节点的下一级所有子节点展开状态都是false,则将该父节点展开状态设置为false,直到当前节点为顶层节点;
B. 如果当前节点是关闭状态,将当前节点展开状态设置为true;
获取当前节点的所有下一级子节点并设置子节点展开状态为true(展开),并将获取到的所有子节点插入到当前显示节点所在index的位置;
从当前节点开始逐级向上遍历,在每一级如果当前节点的父节点的下一级所有子节点展开状态都是true,则将该父节点展开状态设置为true,直到当前节点为顶层节点。
2.4 兼容旧代码
ArcgisLayerMapModel.getProjectListData(projectId, themeList);
通过以上代码获取当前节点的所有非layer的子节点,其中projectId为当前节点的id,themeList为所有节点的集合。在初始化ListView的时候适配了所有顶层节点,即当前显示的list。目前有两种做法:
A. 通过新添加的展开状态从总表中过滤出当前要被显示的数据,然后通过adapter更新ListView视图。
B. 通过展开状态在当前显示的列表添加/删除 当前节点的所有layer层以上的节点,然后通过adapter更新视图。
目前采用了B方法。代码中所有数据都最终指向同一份数据。