首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Picasso中目标在适配器上的使用

Picasso中目标在适配器上的使用
EN

Stack Overflow用户
提问于 2013-11-25 17:09:50
回答 2查看 7.6K关注 0票数 9

我在适配器内使用Target有很大的困难。我对代码的文档感到困惑

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

我试着用这样的方式来使用目标:

代码语言:javascript
运行
复制
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));
....
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-25 17:53:52

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

您的问题是每次调用CustomTarget时都要创建一个新的getView。这与拥有一个Target对象是背道而驰的。让我详细说明一下。

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

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

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

您还将CustomTarget的实现委托给ImageView的实现,确保ImageView的equalshashCode功能满足毕加索的要求。

关于如何实现equalshashCodeWhat issues should be considered when overriding equals and hashCode in Java?的信息

票数 12
EN

Stack Overflow用户

发布于 2014-09-02 09:26:59

看来你的等价物方法坏了。您正在将图像视图与自定义目标进行比较。这可能会解决以下问题:

代码语言:javascript
运行
复制
public boolean equals(Object o) {
    if(o instanceof CustomTarget) {
        return ((CustomTarget) o).imageView.equals(this.imageView);
    }
    return super.equals(o);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20199030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档