Неверное изображение с Glide + Recyclerview и MediaStore.Audio.Media.ALBUM_ID - PullRequest
0 голосов
/ 24 апреля 2019

Я использую этот метод для загрузки изображений и сохранения их в arraylist:

public ArrayList<Song> getMusic(){
    ArrayList<Song> list = new ArrayList<>();
    Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            null,
            null,
            null,
            MediaStore.MediaColumns.TITLE+" ASC");
    if(cursor!=null && cursor.moveToFirst()){
        int id = cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID);
        int title = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
        int artist = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
        int album = cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM);
        do{
            Song song = new Song(cursor.getString(id),
                    cursor.getString(title),
                    cursor.getString(artist),
                    cursor.getString(album));
            list.add(song);
        }while(cursor.moveToNext());
        cursor.close();
    }
    return list;
}

А потом я загружаю изображения в утилизацию. Вот так:

Uri uri = Uri.withAppendedPath(Uri.parse("content://media/external/audio/albumart"), song.getId());
        Glide.with(itemView)
                .load(uri)
                .into(thumb);

И я получаю такой результат:

https://i.stack.imgur.com/TGoog.jpg

Проблема в том, что там, где находится стрелка, есть изображение, которого там быть не должно. Это изображение загружено из моей фотогалереи.

Я нашел решение с помощью Picasso с этим кодом и тем же URI в recyclerView:

Picasso.get().load(uri)
                .into(this.thumb);

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

https://i.stack.imgur.com/fmtTZ.jpg

Итак, как вы можете видеть, второе изображение отлично загружается, как я хочу, но когда я добавляю изображение с измененным размером «Picasso.resize (sizeX, sizeY)», изображение выглядит как первое, которое я опубликовал.

Поэтому мне интересно, есть ли способ загрузить изображения альбомов с помощью Glide, потому что в моем случае при профилировании приложения оно лучше работает в управлении памятью.

Редактировать (это адаптер песни):

public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> implements SectionTitleProvider {

private ArrayList<Song> list;
private onItemClickListener listener;
private int type; // 0 for list, 1 for grid

public SongAdapter(ArrayList<Song> list, int type, onItemClickListener listener){
    this.list = list;
    this.listener = listener;
    this.type = type;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view;
    if(type==0){
        view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.music_item,null,false);
    }else{
        view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.music_item_grid,null,false);
    }
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
    viewHolder.setData(i, listener);
}

@Override
public int getItemCount() {
    return list.size();
}

@Override
public String getSectionTitle(int position) {
    return list.get(position).getTitle().substring(0,1);
}

public class ViewHolder extends RecyclerView.ViewHolder {

    private TextView music, artist;
    private ImageView thumb;
    private ImageButton more;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        music = itemView.findViewById(R.id.textMusic);
        artist = itemView.findViewById(R.id.textArtist);
        thumb = itemView.findViewById(R.id.musicThumb);
        more = itemView.findViewById(R.id.musicOption);
    }

    public void setData(int i, final onItemClickListener listener){
        final Song song = list.get(i);
        music.setText(song.getTitle());
        artist.setText(song.getArtist());

        /*
        Glide.with(itemView)
                .load(uri)
                .into(thumb);
                */

        Uri uri = Uri.withAppendedPath(Uri.parse("content://media/external/audio/albumart"), song.getId());
        Picasso.get().load(uri)
                .into(this.thumb);

        more.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(final View v) {
                 final PopupMenu popup = new PopupMenu(v.getContext(), more);
                 popup.inflate(R.menu.song_menu);
                 popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                     @Override
                     public boolean onMenuItemClick(MenuItem item) {
                         switch (item.getItemId()){
                             case R.id.music_menu_playnow:
                                 return true;
                             case R.id.music_menu_addqueue:
                                 return true;
                             case R.id.music_menu_addplaylist:
                                 return true;
                             case R.id.music_menu_share:
                                 return true;
                             default:
                                 return onMenuItemClick(item);
                         }
                     }
                 });

                 popup.show();
             }
         });
         itemView.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 listener.onItemClick(song);
             }
         });
    }
}

public interface onItemClickListener{
    void onItemClick(Song song);
}

}

...