web-dev-qa-db-ja.com

notifydatasetchanged時にGlideがアイテムImageViewを点滅させる理由

Glide 3.7. with RecyclerViewを使用しています。更新中(notifyDataSetChangedを呼び出す)、アイテムビューは常に点滅します。

これが私のコードです:

Glide
  .with(context)
  .load(filepath)
  .diskCacheStrategy(DiskCacheStrategy.NONE)
  .skipMemoryCache(true)
  .dontAnimate()
  .into(imageview);

キャッシュを使用しない場合、ImageViewメソッドが呼び出され、Glideがビットマップのロードを完了していないときに、notifyDataSetChangedのビットマップがnullになります。

以下のコードを使用する場合:

Glide
  .with(context)
  .load(filepath)
  .dontAnimate()
  .into(imageview);

その後、アイテムImageViewは点滅しなくなります(キャッシュを使用)。

アイテムビューを動的に更新したいので、グライドキャッシュを無効にします。

この瞬きのバグを解決するための解決策はありますか?

どうもありがとうございました!

12
Yoyoy Chu

何度も試した後、SimpleTargetを使用するだけで問題が解決しました。ありがとうございます。

Glide
.with(context)
.load(filepath)
.asBitmap()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.dontAnimate()
.into(new SimpleTarget<Bitmap>() {

            @Override
            public void onResourceReady(Bitmap arg0, GlideAnimation<? super Bitmap> arg1) {
                // TODO Auto-generated method stub
                holder.mItemView.setImageBitmap(arg0);
            }
        });
21
Yoyoy Chu

また、adaptersetHasStableIds(true);を実行し、getItemId()メソッドを適切にオーバーライドすることを忘れないでください。
参照: 実行方法の例

1
Daniil Andashev

Glideをバージョン3から4に更新し、setSupportsChangeAnimations(false) for RecyclerView問題を解決しました

RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator();
if (animator instanceof SimpleItemAnimator) {
    ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
}
1
MakBeard

私の場合、imageViewで定義されたディメンションを使用して問題を解決しました。

<ImageView
        Android:id="@+id/poster_imageview"
        Android:layout_width="130dp"
        Android:layout_height="183dp"
        Android:adjustViewBounds="true"
        Android:scaleType="centerCrop"
        Android:src="@drawable/placeholder" />
0
john invictus

SimpleTargetは非推奨であるため、次のソリューションを試してください。

GlideApp.with(SOMETHING)
                                .load("WHAT")
                                .dontAnimate()
                                .let { request ->
                                    if(imageView.drawable != null) {
                                        request.placeholder(imageView.drawable.constantState?.newDrawable()?.mutate())
                                    } else {
                                        request
                                    }
                                }
                                .into(imageView)

ドローアブル用のNice拡張機能を作成して、実際のコピーを作成することもできます。

import Android.graphics.drawable.Drawable

fun Drawable.copy() = constantState?.newDrawable()?.mutate()
0
Filipkowicz