2015-03-30 3 views
4

У меня есть один ImageView и одно изображение загружается в него с Glide:ImageView обновить с Glide

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 call .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

примечания : В одном случае не обрабатывается один случай: onStop/onStart виджета Он вызывает сбои, когда устройство возвращается из сна. Это должно быть легко исправить, хотя. Я планирую написать лучшую версию этого класса, когда появится glide 4 – Teovald

+0

Здравствуйте @Teovald, у вас есть идея, как использовать это в адаптере recycliewiew для нескольких изображений? Я попробовал некоторые изменения, но для меня ничего не сработало :-( – Tomas

+0

Вы хотите прямо использовать это как элемент RecyclerView? Кажется сложным и дорогостоящим. Думаю, вам следует внимательно следить за сохранением последнего загруженного изображения в ячейке Кстати, я жду официального релиза Glide 4, чтобы переписать этот адаптер немного чище. Когда я написал это, мой min API был 7, я мог бы использовать более эффективную логику привязки с minAPI 16. – Teovald

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

Хорошая идея, спасибо –

Смежные вопросы