1

我正在对 RecyclerView 适配器进行延迟加载。首先,我获取图像元数据(如果有的话),然后让 Picasso 下载实际图像。

public class PostHolder extends RecyclerView.ViewHolder implements Callback<Photo>{
    private PostImageView cover;
    private TextView content;
    private long id;

    public PostHolder(View itemView) {
        super(itemView);
        this.itemView.setOnClickListener(onClickListener);
        content = (TextView) itemView.findViewById(R.id.post_content);
        cover = (PostImageView) itemView.findViewById(R.id.post_image);
    }

    public void setPost(final Post post, int i){
        cover.unsetImage();
        this.id = post.getPhotoId();
        itemView.setTag(i);
        content.setText(post.getMessage());

        if("photo".equals(post.getType()) || "video".equals(post.getType()) && id != 0L){
            cache.get(id, this);
        }else{
            cover.setUrl(post.getImageUrl());
        }
    }

    @Override
    public void result(Photo result) {
        if(result != null && result.getId() == PostHolder.this.id){
            cover.setPhoto(result);
        }
    }
}

cache.get()从缓存中加载我的元数据,结果以result(). setPost()被叫进来onBindViewHolder()。现在我得到了每个人最喜欢的查看器问题——我ImageView在切换到正确的图像之前显示了不同的图像。我知道毕加索正确地处理了这个问题,我检查了我自己的加载,我将持有者的 ID 与元数据 ID 进行比较。我已经在这上面花了几个小时。互联网,你是我唯一的希望。

4

1 回答 1

0

它现在已修复,但我不确定为什么。我相信这是

Picasso
    .with(getContext())
    .cancelRequest(this);

因为unsetImage()加载它需要双重请求。

我认为会发生什么:

  1. Picasso仍在加载上一张图片。
  2. 调度当前图像元数据的调用。
  3. Picasso加载上一个图像。由于Picasso不了解元数据,因此不会自动取消。
  4. 元数据已加载,并Picasso开始加载当前图像。
于 2015-03-25T12:27:36.370 回答