【问题标题】:android - How to sort List<Map<String, String>>android - 如何对 List<Map<String, String>> 进行排序
【发布时间】:2014-01-09 17:53:53
【问题描述】:

我正在使用一个简单的适配器来填充列表视图,我找不到如何通过 groupData 的特定属性对项目进行排序,这是我的代码:

 public class LibraryFragment extends Fragment {

    private  Context mContext;
    private  ListView listView1;
    private ListAdapter adapter;
     private List<Map<String, String>> groupData;
     private Map<String, String> group;
     private  String[] from = new String[] {"url", "title", "artist", "duration"};
     private  int[] to = new int[] {R.id.url, R.id.title, R.id.artist, R.id.duration};

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

        View rootView = inflater.inflate(R.layout.fragment_library, container, false);

        mContext = getActivity();
        listView1 = (ListView) rootView.findViewById(R.id.listView1);
        fillLibrary();

        return rootView;
    }

    public void fillLibrary(){

        ArrayList<Map<String, String>> groupData = new ArrayList<Map<String, String>>();

        File music = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + Environment.DIRECTORY_MUSIC + "/myapp");
        if (music.isDirectory()){
            File tracks[] = music.listFiles();

            MediaMetadataRetriever mmr = new MediaMetadataRetriever();

            for (int i = 0; i < tracks.length; i++) {


                File track = tracks[i];
                String trackPath = track.getAbsolutePath();
                String trackName = track.getName();
                String trackExt = trackName.substring(trackName.lastIndexOf('.') + 1);

                if(trackExt.equals("MP3")||trackExt.equals("mp3"))
                {
                    mmr.setDataSource(trackPath);

                    // -- create record
                    HashMap<String, String> group = new HashMap<String, String>();

                    group.put( "url", trackPath);
                    group.put( "title", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
                    group.put( "artist", mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
                    group.put( "duration", getDurationString(Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION))/1000));

                    groupData.add(group);
                }


            }

            Collections.sort(groupData, Functions.mapComparator);

            adapter = new SimpleAdapter(mContext , groupData, R.layout.library_item, 
                    from,
                    to );

            listView1.setAdapter( adapter );
        }
    }
 }

这是我的函数 Functions.mapComparator

 public static Comparator<Map<String, String>> mapComparator = new Comparator<Map<String, String>>() {
    public int compare(Map<String, String> m1, Map<String, String> m2) {
        return m1.get("title").compareTo(m2.get("title"));
    }
};

你知道我做错了什么吗?

编辑:这里是日志猫

01-09 20:06:12.005: D/AndroidRuntime(10685): Shutting down VM
01-09 20:06:12.005: W/dalvikvm(10685): threadid=1: thread exiting with uncaught exception (group=0x40d31930)
01-09 20:06:12.065: E/AndroidRuntime(10685): FATAL EXCEPTION: main
01-09 20:06:12.065: E/AndroidRuntime(10685): java.lang.NullPointerException
01-09 20:06:12.065: E/AndroidRuntime(10685):    at com.myapp.mobile.Functions$1.compare(Functions.java:44)
01-09 20:06:12.065: E/AndroidRuntime(10685):    at com.myapp.mobile.Functions$1.compare(Functions.java:1)

【问题讨论】:

  • 你得到了什么输出?
  • @TheAbsurd 查看我的编辑
  • 这是一个 NullPointerException 所以在我看来 get("title") 之一正在返回 null。查看地图的标题值。

标签: java android listview adapter android-adapter


【解决方案1】:
  1. 您的其中一张地图似乎不包含“title”值,或者是null
  2. 使用对象而不是地图来存储数据不是更容易吗?喜欢new Song(url, title, artist, duration);。它可以实现Comparable,这样你就不再需要Comparator了。

【讨论】:

  • 我对 android 很陌生,但这似乎是个好主意,那么我该如何实现这样的对象来填充列表视图?
  • 我只会争辩说,在这种情况下,我认为对象的比较方式可能会改变。例如。按标题、艺术家等排序。这是对对象本身的单独关注,应该分开。排序也是列表的一个问题,而不是歌曲。它最适合作为歌曲列表类的一部分。
【解决方案2】:

MediaMetadataRetriever.extractMetadata() 可以返回 null,这就是你得到的。这可能是因为您尝试检索的某些音乐文件没有嵌入标题信息。你应该在添加之前检查extractMetadata()的返回值。

一个简单的检查,如:

String title = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
if (title == null) continue;

将忽略任何没有标题的条目(尽管注意其他属性也可以为空,即使设置了标题),直接跳到下一个条目而不添加。

【讨论】:

  • 你和西蒙都是对的,西蒙速度更快,但你仍然得到了 :) 谢谢
猜你喜欢
  • 1970-01-01
  • 2016-11-25
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 2010-10-17
  • 1970-01-01
  • 2015-06-19
相关资源
最近更新 更多