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

来源:互联网 发布:怎么登录js邮箱 编辑:程序博客网 时间:2024/05/16 15:08

之前做过一个多级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的同学请注意一下)

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 冬天洗棉衣后有一圈白色怎么办 买了一批化肥没有执行标准怎么办 防护栏下面打不了膨胀螺丝怎么办 不知道怀孕照了x射线怎么办 腹部照了x光片照了三次怎么办 像在工厂戴的静电帽弄丢了怎么办 诈骗犯把钱被转到别人账户怎么办 狗狗5个月在家随地大小便怎么办 上课放屁放的快没憋到老是放怎么办 丈夫有外遇并跟小三有一儿子怎么办 借款夫妻双亡借出去的钱怎么办? 橡胶底的劳保鞋开胶了怎么办? 求部队停止有偿服务内部超市怎么办 晋江买了全本还是有防盗章节怎么办 宝宝没有穿衣服的地方长疙瘩怎么办 詹姆斯士兵12魔术贴老是掉怎么办 手机版本不支持陌陌视频聊天怎么办 私人单位不给员工写收入证明怎么办 cad图形缩小后找不到图了怎么办 离婚了老婆嫁给了别人怎么办 对方开车撞伤人逃逸不赔钱怎么办 帮老板开车撞伤人老板不愿赔怎么办 我开车撞人现在伤者住院怎么办 B照驾驶证扣3分怎么办l 驾驶证被盗后被别人拿去消分怎么办 碰瓷的手碰我后视镜怎么办 摩托被盗监控录像器没有记录怎么办 车贷逾期车被贷款公司拖走了怎么办 发现邻居家小孩偷了我的钱该怎么办 孕晚期挺着大肚子好累怎么办 古墓丽影崛起东西满了怎么办 塞尔达传说大师剑耐久没了怎么办 冒险岛遇见超能力者全屏挂机怎么办 当危险来临时该怎么办作文400字 生气把孩子手掌内侧打肿了怎么办 驾驶证未满一年扣12分怎么办 在高速上超速百分之10以下怎么办 中兴手机重启死机开不了机怎么办 太胖了太自卑了该怎么办 儿子因为长的胖特别自卑怎么办? 苹果ld叫我检查身份信息怎么办