2014-07-22 24 views
9

中所做的所有圖像請求,和往常一樣,我們使用適配器來填充listView。在適配器中,我們使用picasso來加載圖像。我發現,當將圖像加載到目標(imageView)時,行被循環使用,畢加索將自動取消該目標的請求。picasso:如何取消在適配器

如何在離開片段或活動時取消所有未完成的請求?

回答

1

但只有當您不在列表/網格適配器中!爲相同的圖像/目標(例如,在適配器getView中)請求圖像 將自動執行 。如果您提出請求,然後離開 屏幕,則只需取消(並且您不需要實際需要 )。

https://github.com/square/picasso/issues/83

+0

我不認爲我明確表示了這個問題。我*不擔心取消正在回收的行的請求,因爲滾動屏幕。我明白,畢加索處理。我的問題是如何在離開擁有適配器的片段或活動時取消所有請求。 – terry

20

這個答案可能來的有點晚,但也許有人仍然需要它...

定義一個ViewHolder它提供了一個清除方法:

static class ImageHolder extends RecyclerView.ViewHolder { 
    public final ImageView image; 

    public ImageHolder(final View itemView) { 
     super(itemView); 
     image = (ImageView) itemView.findViewById(R.id.image); 
    } 

    public void cleanup() { 
     Picasso.with(image.getContext()) 
      .cancelRequest(image); 
     image.setImageDrawable(null); 
    } 
} 

實現onViewRecycled()在您的適配器中:

static class ImageAdapter extends RecyclerView.Adapter<ImageHolder> { 

    // ... 

    @Override 
    public void onViewRecycled(final ImageHolder holder) { 
     holder.cleanup(); 
    } 
} 

取消畢加索請求時,你的碎片的觀點被銷燬(或當你想):

public class MyFragment extends Fragment { 
    private RecyclerView recycler; 

    // ... 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     recycler.setAdapter(null); // will trigger the recycling in the adapter 
    } 
} 

RecyclerView.setAdapter(null)將脫離目前所有加入View S和其相關的ViewHolder旨意被回收。

0

您也可以使用RequestCreator#tag(Object)來處理您的片段/活動提出的請求,然後使用Picasso#cancelTag(Object)取消所有這些請求。

相關問題