2012-06-12 144 views
0

有人可以请指出这里出了什么问题:Android递归文件搜索

下面的代码循环遍历/ SD卡上的目录。如果它找到一个文件,它将名称等添加到数组中。如果它找到一个目录,它就会进入并扫描它。

system.out返回/ sdcard上的所有文件。

的阵列适配器仅列出其发现的在顶级目录

在我的SD卡,我期待它返回两个mp3文件,一个在顶级目录树中的一个安葬。 system.out行找到两者。

我怀疑fls arraylist正在销毁。如果是这样,我该如何去保存这个?

在此先感谢!

public void fill(File f) {  
     File[]files = f.listFiles(); 
      List<Option>fls = new ArrayList<Option>(); 
      if (files != null) { 
       for(File ff: files){ 
        if(!ff.isDirectory()) 
         { 
         /** Only Add MP3's to the list */ 
         String filename=ff.getName(); 
         String ext = filename.substring(
            filename.lastIndexOf('.')+1, filename.length()); 
              if(ext.equals("MP3")||ext.equals("mp3")||ext.equals("Mp3")||ext.equals("mP3")) 
         fls.add(new Option(ff.getName(),"File Size: "+ff.length()/1048576 + "MB",ff.getAbsolutePath())); 
         System.out.println(ff.getName()); 
         } 
        else 
         fill(ff); 
       }  
      } 

     Collections.sort(fls); 
     adapter = new FileArrayAdapter(getActivity(),R.layout.folder_view,fls); 
     this.setListAdapter(adapter); 
     } 

回答

1

用,因为它是ArrayList的将每次你进入一个新的文件夹,你需要采取适配器代码出来的功能,并有填充功能把数组列表作为参数,使每个被重新创建的代码调用将采用相同的数组列表。

即。

List<Option>fls = new ArrayList<Option>(); 

fill(f,fls); 

Collections.sort(fls); 
adapter = new FileArrayAdapter(getActivity(),R.layout.folder_view,fls); 
this.setListAdapter(adapter); 
如果你想保留下来,以一个电话(我不推荐)

,你可以做

fill(f,null); 

,并在填充功能检查,如果数组列表是空的,如果是初始化它,但你仍然必须将它传递给额外的电话。

+0

嗨,感谢您的回复。我已经做出了改变,所以现在按我的意愿工作。然而,它在顶级文件夹层面非常缓慢,它在那里有效地扫描了整个SD卡。大约需要20秒来建立列表。任何优化这个建议?除非可以明显优化,否则我可以简单地将此功能固定在按钮或长按操作上。 –

+0

我能想到的唯一优化就是检查文件扩展名有点不同。 (if)(ff.getName()。toLowerCase()。endsWith(“mp3”); 但是你需要测试才能看到速度差异,很可能你需要在各种各样的asynctask中实现这个,我怀疑它可以足够快到你不需要通知用户的地方 – Jug6ernaut

+0

哦,很好,如果没有其他的东西,那就整理代码,所以我会放弃它,我已经设置了跳过隐藏的目录,以及作为标准目录(DCIM等)的列表跳过,另一种方法是让用户选择一个文件夹并存储它,说了这么多,所有的音乐都在我的/音乐文件夹中,而且这需要很长的时间扫描为上面的级别,这样不会有帮助! –