我在自定义列表适配器中定义了一个视图持有者
viewHolder.albumArt = (ImageView) convertView.findViewById(R.id.album_art);
我最初使用此行将图像设置为持有人引用的视图对象
viewHolder.albumArt.setImageBitmap(
BitmapFactory.decodeFile(songObject.albumArtURI));
但是滚动体验有点落后,所以我尝试使用异步图像加载
// viewHolder.albumArt.setImageBitmap(
// BitmapFactory.decodeFile(songObject.albumArtURI));
ImageLoader().execute(songObject.albumArtURI);
但是现在我在实现Asynch类时遇到了麻烦。具体来说,我需要能够一起传递
viewHolder.albumArt
和songObject.albumArtURI
,但是一次只能传递一个变量。public class ImageLoader extends AsyncTask<URI, Void, Bitmap> {
@Override
protected Bitmap doInBackground(URI... uri) {
return BitmapFactory.decodeFile(uri);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
// This is my problem here
viewHolder.albumArt.setImageBitmap(BitmapFactory.decodeFile(bitmap));
}
}
最佳答案
要传递albumArt,可以在AsyncTask中添加一个构造函数
public class ImageLoader extends AsyncTask<URI, Void, Bitmap> {
private final WeakReference<ImageView> mWeakImageView;
public ImageLoader(ImageView im) {
mWeakImageView = new WeakReference<>(im);
}
onPostExecute
然后ImageView imageView = mWeakImageView.get();
if (imageView != null) {
// set the bitmap
}
或者您可以使用
Picasso
。在您的Adapter
Picasso.with(viewHolder.albumArt.getContext())
.load(// Uri of the picture)
.placeholder(R.drawable.place_holder)
.into(viewHolder.albumArt);
别忘了添加
compile 'com.squareup.picasso:picasso:2.5.2'
到你的gradle
编辑
@Override
protected void onPostExecute(Bitmap bitmap) {
ImageView imageView = mWeakImageView.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
编辑:修复拼写错误