RecyclerView延迟加载

时间:2014-12-13 15:59:13

标签: android-viewholder

我在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在切换到正确的图像之前会显示不同的图像。我知道Picasso正确处理了这个问题,我检查了自己的加载情况,我将持有者的ID与元数据ID进行比较。我已经在这上花了几个小时。互联网,你是我唯一的希望。

1 个答案:

答案 0 :(得分:0)

现在已经修好了,虽然我不确定为什么。我相信它是

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

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

我认为发生了什么:

  1. Picasso仍在加载上一张图片。
  2. 调度当前图像元数据的调用。
  3. Picasso加载preVious图像。由于Picasso不了解元数据,因此不会自动取消。
  4. 加载了元数据,Picasso开始加载当前图像。