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
は点滅しなくなります(キャッシュを使用)。
アイテムビューを動的に更新したいので、グライドキャッシュを無効にします。
この瞬きのバグを解決するための解決策はありますか?
どうもありがとうございました!
何度も試した後、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);
}
});
また、adapter
でsetHasStableIds(true);
を実行し、getItemId()
メソッドを適切にオーバーライドすることを忘れないでください。
参照: 実行方法の例
Glideをバージョン3から4に更新し、setSupportsChangeAnimations(false)
for RecyclerView問題を解決しました
RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator();
if (animator instanceof SimpleItemAnimator) {
((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
}
私の場合、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" />
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()