为什么Glide会在notifydatasetchanged时使项目ImageView闪烁

时间:2016-06-21 12:46:26

标签: android android-recyclerview notifydatasetchanged android-glide blink

我正在使用Glide 3.7.0 enter code here。刷新时,项目视图始终闪烁(调用RecyclerView)。

这是我的代码:

notifyDataSetChanged

当我没有使用缓存时,Glide .with(context) .load(filepath) .diskCacheStrategy(DiskCacheStrategy.NONE) .skipMemoryCache(true) .dontAnimate() .into(imageview); 在调用ImageView方法时有一个空位图,并且Glide还没有完成加载位图。

如果我使用以下代码:

notifyDataSetChanged

然后项目Glide .with(context) .load(filepath) .dontAnimate() .into(imageview); 不再闪烁(使用缓存)。

我想动态更新项目视图,因此我禁用了滑动缓存。

有没有解决这个眨眼错误的解决方案?

非常感谢!

6 个答案:

答案 0 :(得分:21)

经过多次尝试,只需使用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);
            }
        });

答案 1 :(得分:1)

更新Glide从版本3到4和setSupportsChangeAnimations(false) RecyclerView 解决了我的问题

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

答案 2 :(得分:1)

就我而言,我通过在 WifiManager wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE); String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress()); hostname = ip; 上使用定义的维度解决了这个问题。

public static void main() {
    BST tree = //constructed BST
    PrintStream output = new PrintStream(new File(//name of file to write to));
    tree.write(output); // to write the tree to a file
    FileInputStream input = new FileInputStream(//file name goes here);
    tree.read(input); // to construct the tree from a file
}

答案 3 :(得分:0)

也不要忘记在您的setHasStableIds(true);中使用adapter并适当地覆盖getItemId()方法。

答案 4 :(得分:0)

SimpleTarget起已弃用,请尝试以下解决方案:

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

您还可以为drawable创建漂亮的扩展名以制作REAL副本:

import android.graphics.drawable.Drawable

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

答案 5 :(得分:0)

试试下面的 Glide.with(this).load(photoToLoad.getPath()).placeholder(imageView.getDrawable()).into(imageView);