在Picasso中使用Target适配器

时间:2013-11-25 17:09:51

标签: android listview picasso

我在适配器中使用Target时遇到了很大的麻烦。我对代码上的文档感到困惑

  

实现此类的对象必须具有可用的实现     {@link #equals(Object)}和{@link #hashCode()}在内部进行适当的存储。实例     还将比较界面以确定是否正在进行视图回收。建议     在适配器中使用时,可以将此接口直接添加到自定义视图类型以确保     正确的回收行为。

我试图以这种方式使用目标:

class CustomTarget implements Target {
    private ImageView imageView;

    public CustomTarget(ImageView imageView) {
        this.imageView = imageView;
    }

    @Override
    public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
        imageView.setImageDrawable(new RoundedAvatarDrawable(bitmap));
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {
        imageView.setImageDrawable(errorDrawable);
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {
        imageView.setImageDrawable(placeHolderDrawable);
    }

    @Override
    public boolean equals(Object o) {
        return imageView.equals(o);
    }

    @Override
    public int hashCode() {
        return imageView.hashCode();
    }
}

 @Override
public View getView(int position, View v, ViewGroup parent) {
....
    RoundedAvatarDrawable r = new RoundedAvatarDrawable(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_avatar_seahorse));
    ImageCacheController.with(mContext).getPicasso().load(member.getPicture_url()).resize(100, 100).centerCrop().placeholder(r).error(r).into(new CustomTarget(viewHolder.ivAvatar));
....
}

它不起作用,图像随机变换

2 个答案:

答案 0 :(得分:11)

您没有显示整个getView函数,所以在不知道如何使用viewHandler的情况下,这是我对正在发生的事情的看法:

您的问题是,每次调用CustomTarget时,您都会创建新的getView。你反对拥有一个Target对象。让我详细说明一下。

当发出新的下载请求时,先前对同一目标的请求将停止,或者不会导致调用Target的回调。 (因此,如果Target重新用于列表中的不同行,则不会获得两行的图像。)

你正在为每个请求使用一个新对象,有效地暗示Picasso每个请求都是针对不同的行。该文档说“此接口的实例也将进行比较,以确定是否正在进行视图回收”,因此,由于每个请求都有一个新创建的CustomTarget对象,因此没有两个请求具有相同的将无法检测到对象和行回收。

您还在使用viewHolder。在这种情况下,我认为viewHolder应该扩展Target接口(如果每行只有1个图像)。这样,每次请求下载时,您都可以使用相同的对象而不是创建新对象。

您还要将CustomTarget的实施委托给ImageView的实施。确保ImageView的equalshashCode函数满足Picasso要求的要求。

有关如何实施equalshashCode的一些信息:What issues should be considered when overriding equals and hashCode in Java?

答案 1 :(得分:0)

看来你的equals方法已被打破。您正在将imageview与自定义目标进行比较。这可能会解决它:

public boolean equals(Object o) {
    if(o instanceof CustomTarget) {
        return ((CustomTarget) o).imageView.equals(this.imageView);
    }
    return super.equals(o);
}