您的位置:首页 > 移动开发 > Android开发

ListView/RecycleView与树结构实现多级目录

2017-09-02 15:35 393 查看
之前做过一个多级ListView的多级目录结构,终于有闲时间来分享了。先看效果图吧:



常规做法

  ListView为多级的显示方式,与此类似的有文件系统、省市区分级等等,类似于B树。

  其数据结构一般如下可能:

  A. 通过索引连接树的节点,主要特点如下:

  某一点通过索引将所有点联系,类似于链表,任何两点间没有直接关系,如果要得到某个点需要算法和当前表/总表来遍历。存储效率高/内存占用少但遍历较耗时。

  


  

  B. 直接连接树的节点,主要特点如下:

  某一点通过实体类联系所有点,类似于多个数组,任何两点之间都有关系,任何一点都是一个树,如果需要得到某个点,只需要通过算法遍历subLayer/parentLayer即可。占用额外内存但遍历快速(只需要从当前节点开始遍历,不需要节点字典)。

  


核心代码

  

  树结构的核心算法主要是查找了吧。大学的时候做过一个双向带权图的公交网络。

  如果采用做法A,那么主要代码如下(偷懒一下,就用递归吧):

  

  1.查找子节点:

/**
* @param node      当前节点
*/
public static List<Node> getAllChilds(Node node, List<Node> checkCollection) {
List<Node> allChildNode = new ArrayList<>();
if (null != node) {
List<String> childid = node.getSubLayerIds();
if (null != childid)
for (String id : childid) {
Node child  = LeftNodeUtil.getNodeById(id, checkCollection);
if (null != child) {
if (null != allChildNode) {
allChildNode.add(child);
}
}
if (null != child && !child.isLeaf()) {
getAllChilds(child, allChildNode, checkCollection);
}
}
else {
LogManage.e("OneMapActivity", "节点未找到,为空!");
}
}
return allChildNode;
}


/**
* @param node 当前节点
* @param checkCollection 节点字典
*/
public static List<Node> getAllParent(Node node,  List<Node> checkCollection) {
List<Node> allParentIds = new ArrayList<>();
if(null != node) {
String parentId = node.getParentLayerId();
Node pNode = getNodeById(parentId, checkCollection);
if (null != pNode)
allParentIds.add(pNode);
if (null != parentId && null != pNode && !Constants.TOP_NODE_ID.equalsIgnoreCase(parentId)) {
getAllParent(pNode, allParentIds, checkCollection);
}
}
return allParentIds;
}


public static Node getNodeById(String id, List<Node> list) {
Node id_Node = null;
for (Node node : list) {
if (null != id)
if (id.equalsIgnoreCase(node.getId())) {
id_Node = node;
break;
}
}
return id_Node;
}


  到此OK,这就是多级ListView/RecycleView的实现了。(示例代码只是修改原有代码,可能有小问题,Copy&Past的同学请注意一下)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐