5

I need to add a background image to a ListView. Normally I would call listview.setBackground(myImage). But the image is coming from server and so I need to use Picasso to load the image into the background of my ListView. How do I do that?

learner
  • 11,490
  • 26
  • 97
  • 169

1 Answers1

11

Option One

Define an anonymous subclass of com.squareup.picasso.Target

Picasso.with(yourContext)
      .load(yourImageUri)
      .into(new Target() {
        @Override
        @TargetApi(16)
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            int sdk = android.os.Build.VERSION.SDK_INT;
            if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
                yourListView.setBackgroundDrawable(new BitmapDrawable(bitmap));
            } else {
                yourListView.setBackground(new BitmapDrawable(getResources(), bitmap));
            }
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
            // use error drawable if desired
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            // use placeholder drawable if desired
        }
    });

Option Two

Subclass ListView and implement com.squareup.picasso.Target

public class PicassoListView extends ListView implements Target {

    public PicassoListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public PicassoListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    @TargetApi(16)
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        int sdk = android.os.Build.VERSION.SDK_INT;
        if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
            setBackgroundDrawable(new BitmapDrawable(bitmap));
        } else {
            setBackground(new BitmapDrawable(getResources(), bitmap));
        }
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {
        // use error drawable if desired
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {
        // use placeholder drawable if desired
    }

}

Which lets you do this:

Picasso.with(yourContext)
          .load(yourImageUri)
          .into(yourListView);
bmat
  • 2,084
  • 18
  • 24
  • This deserves a check and a +1. Thank you. – learner Oct 06 '14 at 16:00
  • If I call resize between load and into then `onBitmapLoaded` is never called. Is there a way around this problem? I would like to be able to resize. – learner Oct 06 '14 at 17:16
  • 1
    @learner That's odd. `onBitmapLoaded` is called for me in both examples when I call `resize`. I looked into the problem and found [this SO question](http://stackoverflow.com/questions/24180805/onbitmaploaded-of-target-object-not-called-on-first-load) which seems relevant. Hope this helps – bmat Oct 06 '14 at 20:59