使用Picasso在Android ListView中添加背景图片

5

我需要将一张背景图片添加到ListView中。通常情况下,我会调用listview.setBackground(myImage)。但这张图片是从服务器上获取的,因此我需要使用Picasso将图片加载到我的ListView的背景中。我该怎么做?

1个回答

11

选项一

定义一个匿名子类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
        }
    });

选项二

继承 ListView 并实现 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
    }

}

这让你可以做到这一点:

Picasso.with(yourContext)
          .load(yourImageUri)
          .into(yourListView);

这值得检查并点赞。谢谢。 - learner
如果我在load和into之间调用resize,那么onBitmapLoaded永远不会被调用。有没有解决这个问题的方法?我想能够调整大小。 - learner
1
@learner 这很奇怪。当我调用 resize 时,两个示例中都会调用 onBitmapLoaded。我研究了一下这个问题,并找到了这个 SO 问题,它似乎是相关的。希望这可以帮助你。 - bmat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接