2014-12-13 311 views
1

我在RecyclerView適配器上進行延遲加載。首先,我獲取圖像元數據(如果有),然後讓畢加索下載實際圖像。RecyclerView延遲加載

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。我已經花了幾個小時了。互聯網,你是我唯一的希望。

回答

0

它現在已經修復,但我並不確定爲什麼。我相信這是

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

unsetImage()因爲加載它需要的雙重要求。

我想會發生什麼:

  1. Picasso仍在加載以前的圖像。
  2. 調用當前圖像元數據。
  3. Picasso加載preVious圖像。由於Picasso不知道元數據,因此不會自動取消。
  4. 加載元數據,Picasso開始加載當前圖像。