ListView/RecycleView与树结构实现多级目录
2017-09-02 15:35
435 查看
之前做过一个多级ListView的多级目录结构,终于有闲时间来分享了。先看效果图吧:
常规做法
ListView为多级的显示方式,与此类似的有文件系统、省市区分级等等,类似于B树。
其数据结构一般如下可能:
A. 通过索引连接树的节点,主要特点如下:
某一点通过索引将所有点联系,类似于链表,任何两点间没有直接关系,如果要得到某个点需要算法和当前表/总表来遍历。存储效率高/内存占用少但遍历较耗时。
B. 直接连接树的节点,主要特点如下:
某一点通过实体类联系所有点,类似于多个数组,任何两点之间都有关系,任何一点都是一个树,如果需要得到某个点,只需要通过算法遍历subLayer/parentLayer即可。占用额外内存但遍历快速(只需要从当前节点开始遍历,不需要节点字典)。
核心代码
树结构的核心算法主要是查找了吧。大学的时候做过一个双向带权图的公交网络。
如果采用做法A,那么主要代码如下(偷懒一下,就用递归吧):
1.查找子节点:
到此OK,这就是多级ListView/RecycleView的实现了。(示例代码只是修改原有代码,可能有小问题,Copy&Past的同学请注意一下)
常规做法
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的同学请注意一下)
相关文章推荐
- Android-listview实现多级树列表(文件夹目录结构和企业级通讯录结构)
- android TV开发:使用RecycleView实现横向的Listview并响应点击事件
- Android5.x:RecycleView(一):实现ListView + GridView + StaggeredGridLayou效果
- Android:如何在ListView中嵌套ListView (如何实现二级目录结构?)(2)
- Android TV开发:使用RecycleView实现横向的Listview并响应点击事件的代码
- 软键盘弹出,ListView或者RecycleView中的内容上移实现
- RecyclerView多级目录实现
- asp.net mvc多级目录结构和多级area实现技巧
- 利用RecycleView实现类似ListView的Item点击,长按等操作事件以及点击后每一项在添加一个列表
- 打造Android集合控件数据绑定(支持添加监听,支持AbsListView与RecycleView,支持异步加载等)(三)具体实现
- Android应用源码ListView实现的目录树结构
- RecycleView实现ListView和GridView,用menu菜单分别显示
- 一行代码实现去除ListView,RecycleView等可滑动控件的光晕效果
- recycleView简单实现listview的效果
- Android:如何在ListView中嵌套ListView (如何实现二级目录结构?)的两种实现方式
- ListView、Spinner、RecycleView的CommonAdapter
- 任务一 建立包含1500目录的多级目录结构
- Android 自定义view:实现ListView下拉的视差特效
- Android购物车的实现,仿淘宝天猫京东等APP。处理RecyclerView或listview中的选中事件;
- 借助HorizontalScrollView实现多列ListView的横向滑动(含动态加载)