Android:在可点击的列表视图中按标题对mp3文件进行排序

时间:2012-11-28 22:32:04

标签: android listview sorting mp3

我正在尝试为Nexus 7平板电脑创建音乐播放器应用。我能够从特定目录中检索音乐文件以及与它们相关联的信息,例如标题,艺术家等。我已将文件的标题加载到可点击的列表视图中。当用户点击标题时,它会将他们带到播放相关歌曲的活动。我试图按字母顺序对标题进行排序,然后陷入困境。当我只对标题进行排序时,它们不再与正确的歌曲匹配。这是预料之中的,因为我只订购了标题而不是实际文件。我尝试通过这样做来修改排序算法:

//will probably only work for Nexus 7
private final static File fileList = new File("/storage/emulated/0/Music/");
private final static File fileNames[] = fileList.listFiles(); //get list of files

public static void sortFiles()
{
    int j;
    boolean flag = true;
    File temp;

    MediaMetadataRetriever titleMMR = new MediaMetadataRetriever();
    MediaMetadataRetriever titleMMR2 = new MediaMetadataRetriever();

     while(flag)
     {
         flag = false;

         for(j = 0; j < fileNames.length - 1; j++)
         {
             titleMMR.setDataSource(fileNames[j].toString());
             titleMMR2.setDataSource(fileNames[j+1].toString());

             if(titleMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE).compareToIgnoreCase(titleMMR2.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)) > 0)
             {
                 temp = fileNames[j];
                 fileNames[j] = fileNames[j+1];     // swapping
                 fileNames[j+1] = temp;
                 flag = true;
             }//end if 
         }//end for
     }//end while
}

这应该从两个文件中检索歌曲标题,比较它们,如果第一个按字母顺序排在第二个文件后,则交换文件数组中的文件。出于某种原因,当我运行调用此方法的活动时,应用程序崩溃。如果我从 titleMMR2 的数据源中删除<​​strong> + 1 titleMMR2.setDataSource(fileNames[j].toString());

该应用不再崩溃但列表不合规。再次这是可以理解的,因为它将歌曲标题与自己进行比较。我不知道为什么 + 1 会导致程序崩溃。它不是数组越界错误。目录中总共有6个.mp3文件,它们是该目录中的唯一文件。我也试过使用Arrays.sort(fileNames),但只按文件名而不是歌名来命令它们。我也试过这个:

Arrays.sort(fileNames, new Comparator<File>(){
        public int compare(File f1, File f2)
        {
            titleMMR.setDataSource(f1.toString());
            titleMMR2.setDataSource(f2.toString());

            return titleMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE).compareToIgnoreCase(titleMMR2.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
        } });

该片段也导致了崩溃。 java代码中没有错误,并且已导入所有适当的类。我真的不知道出了什么问题。任何帮助将不胜感激,如果需要任何新的信息,我将很乐意提供。提前谢谢。

固定

正确的代码片段是:

public static void sortFiles()
{
    int j;
    boolean flag = true;
    File temp;

    MediaMetadataRetriever titleMMR = new MediaMetadataRetriever();
    MediaMetadataRetriever titleMMR2 = new MediaMetadataRetriever();

     while(flag)
     {
         flag = false;

         for(j = 0; j < fileNames.length - 1; j++)
         {
             titleMMR.setDataSource(fileNames[j].toString());
             titleMMR2.setDataSource(fileNames[j+1].toString());

             String title1;
             String title2;

             if(titleMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) == null)
                 title1 = fileNames[j].getName();
             else
                 title1 = titleMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);

             if(titleMMR2.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) == null)
                 title2 = fileNames[j+1].getName();
             else
                 title2= titleMMR2.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);

             if(title1.compareToIgnoreCase(title2) > 0)
             {
                 temp = fileNames[j];
                 fileNames[j] = fileNames[j+1];     // swapping
                 fileNames[j+1] = temp;
                 flag = true;
             }//end if 
         }//end for
     }//end while
}

0 个答案:

没有答案