9

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

实现此类的对象必须具有 {@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));
....
}

它不起作用,图像之间随机变化

4

2 回答 2

12

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

你的问题是你CustomTarget每次getView被调用时都会创建一个新的。你违背了拥有一个Target对象的观点。让我详细说明。

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

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

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

您还将您的实施委托CustomTargetImageView' 实施。确保 ImageView 的equalshashCode功能满足毕加索的要求。

关于如何实现的一些信息equalshashCode在 Java 中覆盖 equals 和 hashCode 时应该考虑哪些问题?

于 2013-11-25T17:53:52.997 回答
0

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

public boolean equals(Object o) {
    if(o instanceof CustomTarget) {
        return ((CustomTarget) o).imageView.equals(this.imageView);
    }
    return super.equals(o);
}
于 2014-09-02T09:26:59.103 回答