Как я могу заполнить RecyclerView значениями hashmap? - PullRequest
1 голос
/ 02 апреля 2020

Раньше я использовал ArrayList для этого, но из-за дублирующихся проблем с альбомами (которые я решил до API29 с помощью операторов DISTINCT и GROUP BY), которые больше нельзя использовать внутри запроса.

Я получил такие значения в моем RecyclerViews Adapter: 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();
}

1 Ответ

1 голос
/ 02 апреля 2020

По определению HashMap не сортируется, так как насчет SortedMap? Реализация SortedMap - это TreeMap, которая сортирует записи по ключам (или Comparator).

Я считаю, что это вам подходит, так как ваша карта имеет целые числа как ключи.

Редактировать: Вы можете использовать List или любую другую коллекцию, подходящую вам в вашем адаптере. Например, сохраните ссылку на идентификаторы и альбомы, которые представляют собой данные, которые вы хотите отобразить через адаптер.

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();
        }
    }

Теперь, когда у вас есть массивы, вы также можете сортировать их, если хотите, и если вы хотите получить третий альбом и его идентификатор, все, что вам нужно сделать, это

int id = ids[2];
Album album = albums[2];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...