2014-12-13 3 views
1

Я занимаюсь ленивой загрузкой адаптера RecyclerView. Сначала я получаю метаданные изображения (если он есть), а затем позволяет Picasso загружать фактическое изображение.RecyclerView lazy loading

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 отображает другое изображение, прежде чем переключиться на правильный. Я знаю, что Пикассо правильно справляется с этим, и у меня есть проверка на мою собственную загрузку, где я сравниваю идентификатор владельца с идентификатором метаданных. Я потратил на это несколько часов. Интернет, ты моя единственная надежда.

ответ

0

Это исправлено сейчас, хотя я не совсем уверен, почему. Я считаю, что это

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

внутри unsetImage() из-за двойного запроса, необходимого для его загрузки.

То, что я думаю, что происходит:

  1. Picasso все еще грузится предыдущее изображение.
  2. Отправляется вызов для текущего метаданных изображения.
  3. Picasso загружает предварительное изображение. Поскольку Picasso не знает о метаданных, он не отменяется автоматически.
  4. Загрузка метаданных, и Picasso начинает загрузку текущего изображения.