我在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进行比较。我已经在这上花了几个小时。互联网,你是我唯一的希望。
答案 0 :(得分:0)
现在已经修好了,虽然我不确定为什么。我相信它是
Picasso
.with(getContext())
.cancelRequest(this);
在unsetImage()
内,因为加载它需要双重请求。
我认为发生了什么:
Picasso
仍在加载上一张图片。Picasso
加载preVious图像。由于Picasso
不了解元数据,因此不会自动取消。Picasso
开始加载当前图像。