2017-01-23 4 views
0

私は、リストビュー内の曲のカバーを表示するには、このコードを使用しています:アルバムのカバーを表示するには?

package com.xrobotx.love.musicalbums; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.TimeUnit; 

import android.content.Context; 
import android.graphics.drawable.Drawable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 

import com.bumptech.glide.Glide; 

public class SongAdapter extends BaseAdapter { 

    private List<Song> songs; 
    private LayoutInflater songInf; 
    Context mContext; 

    public SongAdapter(Context c, List<Song> theSongs){ 
     songs=theSongs; 
     songInf=LayoutInflater.from(c); 
     mContext = c; 
    } 

    @Override 
    public int getCount() { 
     return songs.size(); 
    } 

    @Override 
    public Object getItem(int arg0) { 
     return songs.get(arg0); 
    } 

    @Override 
    public long getItemId(int arg0) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     //map to song layout 
     RelativeLayout songLay = (RelativeLayout)songInf.inflate 
       (R.layout.song_layout, parent, false); 

     //get title and artist views 
     TextView songView = (TextView)songLay.findViewById(R.id.song_title); 
     TextView artistView = (TextView)songLay.findViewById(R.id.song_artist); 
     TextView durationView = (TextView)songLay.findViewById(R.id.song_duration); 
     ImageView coverView = (ImageView)songLay.findViewById(R.id.song_cover); 

     //get song using position 
     Song currSong = songs.get(position); 

     //get title and artist strings 
     songView.setText(currSong.getTitle()); 
     artistView.setText(currSong.getArtist()); 
     durationView.setText(String.format("%02d:%02d", 
       TimeUnit.MILLISECONDS.toMinutes((long) currSong.getDuration()), 
       TimeUnit.MILLISECONDS.toSeconds((long) currSong.getDuration()) - 
         TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) currSong.getDuration())))); 


     if(currSong.getCover() != null){ 
      Glide.with(mContext).load(currSong.getCover()).override(50, 50).into(coverView); 
     } 


     songLay.setTag(position); 
     return songLay; 
    } 

} 

すべてのカバーが正しく表示されるわけではありません。いくつかのカバーは黒です。 なぜですか?

EDIT:

private static String getCoverArtPath(long albumId, Context context) { 
    Cursor albumCursor = context.getContentResolver().query(
      MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, 
      new String[]{MediaStore.Audio.Albums.ALBUM_ART}, 
      MediaStore.Audio.Albums._ID + " = ?", 
      new String[]{Long.toString(albumId)}, 
      null 
    ); 
    boolean queryResult = albumCursor.moveToFirst(); 
    String result = null; 
    if (queryResult) { 
     result = albumCursor.getString(0); 
    } 
    albumCursor.close(); 
    return result; 
} 
+0

'Glide'コードは問題ありません。すべての画像が利用可能であることを確認しましたか? 'Glide.with(mContext).load(currSong.getCover()).aller(50、50).error(R.drawable.errorDrawable).into(coverView);'エラーがあるかどうかを調べる読み込み中に –

+0

カバーのURLが黒い画像を返すことがあります。すべてのcyrrSon.getCover()が有効な画像を返すことを確かめますか? –

+0

@DrilonBlakqoriあなたのコードを使用すると、黒い画像は表示されず、R.drawable.errorDrawable画像が表示されます。それでエラーはありますか?ただし、一部の画像は正しく表示されます。たぶん私はキャッシュをクリアする必要がありますか? – xRobot

答えて

1

私はこれに走った:

これはカバーを取得するためのコードです。他の要求と同様にネットワークの要求をグライド時々失敗する

私が見つけた解決策は、失敗したときに別の要求をすることです。

Glide.with(context) 
.load((currSong.getCover()) 
.asBitmap() 
.into(new SimpleTarget<Bitmap>(width, height) { 
    @Override 
    public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) { 
     //handle Bitmap 
     coverview.setBitmap(resource); 
    } 

    @Override 
    public void onLoadFailed(Exception e, Drawable errorDrawable) { 
     Glide.with(mContext).load(currSong.getCover()).override(50, 50).into(coverView); 

    } 
}); 
関連する問題