我在自定义列表适配器中定义了一个视图持有者

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.albumArtsongObject.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);
  }
}


编辑:修复拼写错误

10-08 15:00