如何从Android中的文件夹和子文件夹中以迭代方式选择文件?

如何从Android中的文件夹和子文件夹中以迭代方式选择文件?,android,mp3,subdirectory,android-music-player,Android,Mp3,Subdirectory,Android Music Player,我正在开发一个应用程序,其中我正在生成所有mp3文件的列表,并将其添加到自定义列表中。我有一个程序,但问题是它不会返回子文件夹中的文件 有没有人能给我建议,或者给我一个链接或者别的什么,这样我就可以反复地做?我希望以迭代的方式进行,因为如果我不这样做,我将不得不在方法之间传递大量信息,这将变得非常混乱。我试着这么做,结果完全弄糊涂了 代码如下: public class FragmentSongs extends Fragment { private static final Stri

我正在开发一个应用程序,其中我正在生成所有mp3文件的列表,并将其添加到自定义列表中。我有一个程序,但问题是它不会返回子文件夹中的文件

有没有人能给我建议,或者给我一个链接或者别的什么,这样我就可以反复地做?我希望以迭代的方式进行,因为如果我不这样做,我将不得不在方法之间传递大量信息,这将变得非常混乱。我试着这么做,结果完全弄糊涂了

代码如下:

public class FragmentSongs extends Fragment {

    private static final String Sd_Path=new String("/sdcard/");
    private MediaPlayer mp =new MediaPlayer();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_a, container, false);
        ListView SngList = (ListView) view.findViewById(R.id.SongList);

           ArrayList<SongDetails> Songinfo;
             // AdapterView.AdapterContextMenuInfo info;
              Songinfo = new ArrayList<SongDetails>();

            File f=new File("/sdcard/");
            File[] files = f.listFiles(new Mp3Filter());
            if( files.length>0)
            {
                for(int i=0; i<files.length; i++) 
                {SongDetails detail=new SongDetails();
                    detail.setIcon(R.drawable.ic_launcher);
                 detail.setSong(files[i].getName());
                 detail.setArtist(files[i].getName());
                 detail.setAlbum(files[i].getName());
                 Songinfo.add(detail);
                }  SngList.setAdapter(new CustomAdapter(Songinfo ));
            }
            else  if (files.length == 0)
                return null;
        return view;
    } }
class Mp3Filter implements FilenameFilter{
    public boolean accept(File dir,String name)
    {
    return (name.endsWith(".mp3"))|| (name.endsWith(".Mp3")) ||(name.endsWith(".MP3"));//searching for the files
    }
}
公共类片段扩展片段{
私有静态最终字符串Sd_Path=新字符串(“/sdcard/”);
私有MediaPlayer mp=新MediaPlayer();
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment_a,容器,错误);
ListView SngList=(ListView)view.findViewById(R.id.SongList);
ArrayList Songinfo;
//AdapterView.AdapterContextMenuInfo信息;
Songinfo=newarraylist();
文件f=新文件(“/sdcard/”);
File[]files=f.listFiles(新的Mp3Filter());
如果(文件长度>0)
{

对于(int i=0;i为您的活动添加一个单独的方法,该方法执行以下操作:

private ArrayList<SongDetails> getSongsFromDirectory(File f){
    ArrayList<SongDetails> songs = new ArrayList<SongDetails>();
    if (!f.exists() || !f.isDirectory()) return songs;

    File[] files = f.listFiles(new Mp3Filter());

    for (File file : files){
       if (file.isDirectory()){
          songs.addAll(getSongsFromDirectory(file));
       }
       else{
          SongDetails detail=new SongDetails();
          detail.setIcon(R.drawable.ic_launcher);
          String fileName = file.getName();
          detail.setSong(fileName);
          detail.setArtist(fileName);
          detail.setAlbum(fileName);
          songs.add(detail);
       }
    }

    return songs;
}
最后,将onCreateView中的代码更改为:

View view = inflater.inflate(R.layout.fragment_a, container, false);
ListView SngList = (ListView) view.findViewById(R.id.SongList);
File f=new File("/sdcard/");
ArrayList<SongDetails> Songinfo = getSongsFromDirectory(f);
if (songinfo.size()>0){
   SngList.setAdapter(new CustomAdapter(Songinfo));
   return view;
}
else return null;
视图=充气机。充气(R.layout.fragment_a,容器,false);
ListView SngList=(ListView)view.findViewById(R.id.SongList);
文件f=新文件(“/sdcard/”);
ArrayList Songinfo=getSongsFromDirectory(f);
如果(songinfo.size()>0){
setAdapter(新的CustomAdapter(Songinfo));
返回视图;
}
否则返回null;

请注意,我没有测试这段代码,但它至少应该让您知道如何完成它。

嘿,这意味着您想构建类似文件管理器的东西来访问文件?不完全是,我只想让它返回我不想返回的文件(在列表中)我的代码只在我提供的文件夹中搜索文件,而不是在它的子文件夹中,它存在一个递归版本,涉及一个单独的方法,但我不想对它使用单独的方法,如上所述,变量“i”会发生什么?好的,对不起,我会解决这个问题。它崩溃了,我必须重新初始化变量“f”在您的方法文件中,f=new File(“/sdcard/”);因为它是一个局部变量……。我希望这不会产生问题??这就是为什么我避免使用单独的方法。代码中还有另一个错误;)我现在已经修好了。请注意getSongsFromDirectory接受的参数的名称。是的,我注意到,我也在考虑做同样的事情,我不擅长在方法之间传递信息,谢谢你的时间,如果可行的话,请告诉我c。
View view = inflater.inflate(R.layout.fragment_a, container, false);
ListView SngList = (ListView) view.findViewById(R.id.SongList);
File f=new File("/sdcard/");
ArrayList<SongDetails> Songinfo = getSongsFromDirectory(f);
if (songinfo.size()>0){
   SngList.setAdapter(new CustomAdapter(Songinfo));
   return view;
}
else return null;