Во-первых, я не уверен, почему вы пытаетесь отсортировать по альбомам, когда вы сохраняете возвращенные значения по песням (см. @Usman Rafi выше), но ..
Добавьте глобального массива в начало вашего фрагмента
ArrayList<Song> Albums = new Arraylist<>();
не пытайтесь добавлять информацию о жанре - она вам не нужна для ваших целей
Я попытался отсортировать идентификаторы альбомов, но это не исправило это, потому что идентификатор альбома, очевидно, не имеет отношения к сортировке рисунков.
Обложка альбома Uri's может быть записана как:
ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"),
cursor.getInt(cursor.getInt(cursor.getColumnIndexOrThrow(SONG_ALBUMID))));
Итак, обложка альбома и album_id на самом деле неразрывно связаны.
Так что моя проблема в том, что когда я пытаюсь отсортировать альбомы ...
Используйте MediaStore.Audio.Media.IS_MUSIC + "= 1) GROUP BY (" + MediaStore.Audio.Media.ALBUM в переменной выбора вашего запроса ...
При этом будут возвращены уникальные имена альбомов (также будет возвращена только одна песня в альбоме), если альбом повторяется (при наличии нескольких песен из одного альбома) в базе данных вашего медиастора, только первый экземпляр, который соответствует вашему запросу будет добавлен к вашему курсору.
для сортировки альбомов ...
Используйте порядок сортировки для сортировки строк курсора, возвращаемых альбомом; Я лично сортирую их, используя алфавитный порядок sql (символы, цифры, a, b, c ....)
Здесь следует отметить, что сортировка чувствительна к регистру, если вы не укажете "COLLATE NOCASE"
чтобы написать запрос и отсортировать его, я бы использовал следующий код:
String[] projection = {"DISTINCT " + MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.IS_MUSIC};
String selection = MediaStore.Audio.Media.IS_MUSIC +
"=1 ) GROUP BY (" + MediaStore.Audio.Media.ALBUM_ID;
String sort = MediaStore.Audio.Media.ALBUM + " COLLATE NOCASE ASC";
Cursor cursor = context.
getContentResolver().
query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
projection,
selection,
null,
sort);
После этого вы можете просто перемещаться по курсору, добавляя каждую строку к созданному вами объекту данных, дальнейшая сортировка не требуется, и все должно быть в правильном порядке.
Лично я просто перебираю
if(cursor != null && cursor.getCount >0){
while(cursor.moveToNext()){
//create new song item and add the album information you need
Song album = new Song(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media._ID)),
cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)));
album.setAlbumId(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)));
album.setAlbumId(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)));
//add the Song item to the global arraylist
Albums.add(album)
}
}
cursor.close();
теперь вы можете получить доступ к отсортированной информации об альбоме по позиции в массиве ... вы можете перейти к обложке альбома с помощью построителя Uri, который я показал вам сверху ...
вот так
Song Album = Albums.get(position);
imageView.setURI(ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"),
Album.getAlbumID());
Надеюсь, это вам пригодится.
я все еще думаю, что вы должны создать класс данных с именем Album