Android开发多层树型目录的实现

时间:2022-09-17 12:57:49
    树型目录是一种直观的列表显示目录方式,在用户界面得到普遍使用,如Windows的资源管理器窗口,Eclipse的Package Explorer等。因此,我们也想在Android应用中使用这种方式实现对各类信息的分层与显示。然而,Android应用层只提供了ListView单层列表和ExpandableListView二级列表,无法直接显示像树型目录这样多层次的列表。那么如何在android应用上实现这树型目录呢。
   我们知道ListView显示列表是通过添加适配器Adapter,适配器装配数据,在适配器的getView()方法中实现绘制列表的每一行。因此,我们可以得出,要实现树型目录的展开,收起,只是让适配器装配不同的数据。明白了这些,那么我们来实现树型目录就易如反掌。
   首先,先来分析下树型目录的基本元素—目录结点TreeNode,每一个节点都有父节点(根节点除外)和可能存在子节点列表,每一个节点可以是目录也可以是一个文件,每一个节点在树型目录中都有一个等级level,节点有展开,收起状态expanded。
   在弄清了目录节点具备的属性及动作后,我们需要为每一个TreeNode对象添加子节点列表childNodes,简单地说就是每一级目录的子目录。我们知道,在java程序中,使用递归遍历目录,因此,在这里我们也使用递归来为每一个节点增加子节点列表。
//parentNode是父节点,parentFile父节点所在的目录。
private void createTree(TreeNode parentNode, File parentFile) {
       if (parentFile.isDirectory()) { // 是目录
           parentNode.setIsDirectory(true);       //设置节点为目录
           if (parentFile.list().length > 0) {
              parentNode.setHasChild(true);      //该节点有子节点
           }
           for (File subFile : parentFile.listFiles()) { 

              TreeNode subNode = new TreeNode(subFile.getName());
              subNode.setHasParent(true)      //子节点有父节点;
              subNode.setLevel(parentNode.getLevel() + 1);//节点等级
              parentNode.addChild(subNode);      //添加子节点
              createTree(subNode, subFile);      //递归
           }
       } else { // 是文件
           parentNode.setIsDirectory(false);
           parentNode.setHasChild(false);
       }
}

   这样,我们为每一个节点都添加了子节点,在适配器中只需将子节点列表添加到适配器的数据列表就可以显示展开目录,数据列表移除子节点列表即可收起目录。代码如下:    
            if (node.getIsDirectory()) {
                  if (node.isExpanded()) { // 收起
                     node.setExpanded(false);
                     ArrayList<TreeNode> temp = new ArrayList<TreeNode>();
                     for (int i = position + 1; i < treeNodes.size(); i++) {
                         if (node.getLevel() == treeNodes.get(i).getLevel()) {
                            break;
                         }
                         treeNodes.get(i).setExpanded(false);
                         temp.add(treeNodes.get(i));
                     }
                     treeNodes.removeAll(temp);
                     TreeListAdapter.this.notifyDataSetChanged();
                  } else { // 展开
                     node.setExpanded(true);
                     for (TreeNode childNode : node.getChildNodes()) {
                         childNode.setExpanded(false);
                         treeNodes.add(position + 1, childNode);
                     }
                     TreeListAdapter.this.notifyDataSetChanged();
                  }
         }
完成整代码详见:http://user.qzone.qq.com/314154775/infocenter#!app=2&pos=1335594212

3 个解决方案

#1


该回复于2012-04-28 17:40:29被版主删除

#2


  大神啊,还是有些小问题想问你。  38182665求加企鹅。

#3


 if (node.getLevel() == treeNodes.get(i).getLevel()) {
                            break;
                         }


这里应该是 大于等于 才对

#1


该回复于2012-04-28 17:40:29被版主删除

#2


  大神啊,还是有些小问题想问你。  38182665求加企鹅。

#3


 if (node.getLevel() == treeNodes.get(i).getLevel()) {
                            break;
                         }


这里应该是 大于等于 才对