[在我为此使用ArrayList之前,但是由于存在重复的专辑问题(我在API29之前通过使用DISTINCT
和GROUP BY
语句解决了此问题),这些问题不再允许在查询中使用。
我在RecyclerViews适配器中获得了这样的值:myArrayList.get(position).getAlbum();
但是现在我正在使用HashMap,我该如何按位置获得从适配器获得的值?
用于在Hashmap中添加值的代码
HashMap<Integer, Album> albums = new HashMap<>();
String[] projection2 = { MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.IS_MUSIC};
String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0";
String sort = MediaStore.Audio.Media.ALBUM + " COLLATE NOCASE ASC";
cursor = resolver.query(musicUri, projection2, selection, null, sort);
try {
if (cursor != null) {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
int columnAlbumId = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID);
int columnAlbumName = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM);
String albumId = cursor.getString(columnAlbumId);
String albumName = cursor.getString(columnAlbumName);
if(albums.containsKey(albumId) == false){
Album album = new Album(albumId, albumName);
albums.put(albumId, album);
}
cursor.moveToNext();
}
}
}catch (Exception e){
Log.e(TAG, "Exception caught when creating ALBUM!", e);
throw new Exception();
}
根据定义,HashMap
未排序,所以SortedMap
怎么样? SortedMap
的实现是TreeMap
,它对条目根据键(或Comparator
)进行排序。
我相信这很适合您,因为您的地图使用整数作为键。
编辑:您可以在适配器中使用List
或任何适合您的集合。例如,保留对ID和专辑的引用,这是您希望通过适配器显示的数据。
private int[] ids; private Album[] albums;
当您将数据(包含在映射中)传递到适配器时,可以提取该数据并将其放置在数组容器中,以便可以利用索引。例如,
public MyAdapter(Map<Integer,Album> data){ ids = new int[map.size()]; albums = new Album[map.size()]; int i = 0; for (Map.Entry<Integer,Album> e : map.entrySet()){ ids[i] = e.getKey(); albums[i++] = e.getValue(); } }
现在有了数组,您可以根据需要对它们进行排序,以防您想获取第三张专辑及其ID,
int id = ids[2];
Album album = albums[2];