Android MediaStore忽略大小写排序DISPLAY_NAME的实现方法
解决MediaStore音频文件忽略大小写排序的问题
这问题我之前做音频播放器的时候也踩过坑!默认的DISPLAY_NAME ASC排序是区分大小写的,因为SQLite默认的字符串比较是基于ASCII值的——大写字母的ASCII码比小写的小,所以所有带大写开头的文件会直接跑到列表最前面,和小写开头的完全分开,体验很不好。
给你两种靠谱的解决办法,按需选:
方法一:数据库层面用LOWER()函数排序(推荐)
直接在排序规则里把DISPLAY_NAME转成小写后再排序,这样就能忽略大小写的差异了。修改你的sortOrder变量就行:
String[] proj = { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST }; // 关键修改在这里:用LOWER()包裹字段名 String sortOrder = "LOWER(" + MediaStore.Audio.Media.DISPLAY_NAME + ") ASC";
原理很简单:把所有文件名转成小写后再做升序比较,"Apple"和"banana"会被当成"apple"和"banana"来排序,自然就混在一起按字母顺序排列了。这种方法的优势是在数据库层面完成排序,性能比内存排序好得多,尤其是音频文件数量多的时候。
方法二:内存中自定义排序(适合小数据量)
如果因为某些原因没法在SQL层面处理(比如需要叠加特殊的排序逻辑),可以把查询到的数据拿到内存里,用compareToIgnoreCase()手动排序。比如你把音频数据封装成了AudioModel类,代码大概是这样:
// 假设你已经从Cursor里把数据转成了List<AudioModel> audioList Collections.sort(audioList, new Comparator<AudioModel>() { @Override public int compare(AudioModel a1, AudioModel a2) { // 忽略大小写比较DISPLAY_NAME return a1.getDisplayName().compareToIgnoreCase(a2.getDisplayName()); } });
不过这种方法只适合音频文件不多的场景,数据量大的话内存排序会拖慢性能,所以优先选方法一。
内容的提问来源于stack exchange,提问作者Pam
相关产品推荐
相关产品推荐

