如何异步将图像设置为视图保持器

时间:2015-11-06 20:15:50

标签: android

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

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

1 个答案:

答案 0 :(得分:5)

要传递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);
  } 
}

编辑:修正拼写错误