2015-03-30 65 views
4

我有一個ImageView的,一個圖像加載在它的Glide:ImageView的刷新與滑翔

Glide.with(ImageView.getContext()) 
    .load(url) 
    .dontAnimate() 
    .placeholder(R.drawable.placeholder) 
    .signature(stringSignature) 
    .into(new GlideDrawableImageViewTarget(ImageView) { 
     @Override 
     public void onResourceReady(GlideDrawable drawable, GlideAnimation anim) { 
      super.onResourceReady(drawable, anim); 
      progressBar.setVisibility(View.GONE); 
     } 
    }); 

,當我想刷新形象,我只能用新的簽名再次運行此相同的代碼。它的工作完美,但是當新的加載開始時,可​​見圖像立即消失。

問題

可能保持ImageView的圖像並更換新的圖像被下載之後?

回答

3

這是預期的行爲。
每當您撥打.load(x)時,Glide呼叫目標.clear()及其相關請求。
這就是Glide如何處理其位圖池,否則無法知道何時回收位圖。
爲了實現這一點,需要兩個目標之間切換,這裏的核心思想是:

public <T> void loadNextImage(@NonNull T model, 
            @NonNull BitmapTransformation... transformations) { 
     //noinspection MagicNumber 
     int hash = model.hashCode() + 31 * Arrays.hashCode(transformations); 
     if (mLastLoadHash == hash) return; 
     Glide.with(mContext).load(model).asBitmap().transform(transformations).into(mCurrentTarget); 
     mLastLoadHash = hash; 
    } 

Target mCurrentTarget; 



private class DiaporamaViewTarget extends ViewTarget<ImageView, Bitmap> { 

     @Override 
     public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { 
      mLoadedDrawable = new BitmapDrawable(mImageView.getResources(), resource); 
      // display the loaded image 
      mCurrentTarget = mPreviousTarget; 
+1

記:不處理IIRC一種情況:小部件的onStop/onStart 當設備從睡眠狀態恢復時,它會導致崩潰。 雖然應該很容易修補。我計劃在glide 4出來時寫出更好的這個類的版本 – Teovald 2015-10-14 13:20:54

+0

Hello @Teovald,你有一個想法,如何在recyclerview適配器中使用這個來創建多個圖像?我嘗試了一些修改,但沒有爲我工作:-( – Tomas 2015-11-28 02:40:20

+0

你想直接使用它作爲一個RecyclerView項目?它似乎棘手和昂貴。我想你應該特別注意跟蹤最後加載的圖像在一個單元格中 btw,我正在等待Glide 4正式發佈,以便更好地重寫這個適配器。當我寫這個時,我的min API是7,我可以使用minAPI 16更高效的綁定邏輯。 – Teovald 2015-11-28 07:54:17

1

可以在接下來的加載設置加載繪製對象爲佔位符,就像這樣:

private Drawable placeholder = ContextCompat.getDrawable(ctx, R.drawable.placeholder); 

    public void loadImage(String url, ImageView imageView) { 
     Glide.with(imageView.getContext()) 
      .load(url) 
      .placeholder(placeholder) 
      .into(new GlideDrawableImageViewTarget(imageView) { 
       @Override 
       public void onResourceReady(GlideDrawable drawable, GlideAnimation anim) { 
        super.onResourceReady(drawable, anim); 
        placeholder = drawable; 
       } 
      }); 
    } 
+0

好主意,謝謝 – 2017-08-13 22:05:09