【问题标题】:Android Recursive File SearchAndroid 递归文件搜索
【发布时间】:2012-06-15 19:52:29
【问题描述】:

谁能指出这里出了什么问题:

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

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

数组适配器只列出它在顶级目录中找到的内容

在我的 sd 卡上,我希望它返回两个 mp3 文件,一个在顶级目录中,一个埋在树中。 system.out 行找到了两者。

我怀疑 fls 数组列表正在被破坏。如果是,我该如何保存?

提前致谢!

 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);   
        }

【问题讨论】:

    标签: android file list search recursive-query


    【解决方案1】:

    使用代码,每次进入新文件夹时都会重新创建arraylist,您需要将适配器代码从函数中取出,并让fill函数将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);
    

    并在填充函数中检查 arraylist 是否为空,如果它正在初始化它,但您仍必须将其传递给其他调用。

    【讨论】:

    • 您好,感谢您的回复。我已经进行了更改,所以现在可以按我希望的那样工作。然而,它在顶级文件夹级别相当慢,它有效地扫描整个 SD 卡。构建列表大约需要 20 秒。有什么优化这个的建议吗?除非可以显着优化,否则我可能只是将此功能粘贴在按钮或长按操作上。
    • 我能想到的唯一优化是让你检查文件扩展名有点不同。通过, if(ff.getName().toLowerCase().endsWith("mp3"); 但您需要测试以查看速度差异。很可能您需要在各种异步任务中实现这一点,我怀疑它可以足够快到您不需要通知用户的地方。
    • 哦,太好了,如果没有别的,那就整理代码,所以无论如何我都会放弃它。我将其设置为跳过隐藏目录,以及要跳过的标准目录(DCIM 等)列表。另一种方法是要求用户选择一个文件夹并存储它。说了这么多,所有的音乐都在我的 /Music 文件夹中,扫描所需的时间与上面的级别一样长,所以这无济于事!
    猜你喜欢
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2020-02-24
    • 2014-12-09
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    相关资源
    最近更新 更多