2012-06-12 182 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等)的列表跳過,另一種方法是讓用戶選擇一個文件夾並存儲它,說了這麼多,所有的音樂都在我的/音樂文件夾中,而且這需要很長的時間掃描爲上面的級別,這樣不會有幫助! –