在调用notifyDataSetChanged方法后,Universal Image Loader网格视图闪烁。

8

我正在使用以下配置的UIL从文件中加载图像:

BitmapDisplayer displayer = new FadeInBitmapDisplayer(500) {

        @Override
        public Bitmap display(Bitmap bitmap, ImageView imageView,
                LoadedFrom loadedFrom) {
            if (loadedFrom != LoadedFrom.MEMORY_CACHE) {
                return super.display(bitmap, imageView, loadedFrom);
            } else {
                imageView.setImageBitmap(bitmap);
                return bitmap;
            }
        }

    };
    DisplayImageOptions options = new DisplayImageOptions.Builder()
            .cacheInMemory(true).resetViewBeforeLoading(true)
            .showImageForEmptyUri(R.drawable.thumbnail_no_image)
            .showImageOnFail(R.drawable.thumbnail_no_image)
            .displayer(displayer).build();
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
            context).defaultDisplayImageOptions(options)
            .memoryCacheSize(2 * 1024 * 1024).build();
    sLoader.init(config);

我需要在GridView中实现选择功能,所以当我考虑到任何项目被选中后,我调用notifyDataSetChanged来使我的选择覆盖层可见。但是,在这个调用之后,所有的图片都开始重新加载,这导致GridView闪烁。我该如何避免这种情况?

2个回答

3
我认为在这种情况下不应该调用notifyDataSetChanged
在适配器上调用notifyDataSetChanged会告诉ListView / GridView您的数据已更改,您应该刷新自己。因此,当您调用此方法时,它会重新加载并调用适配器的getView()。这就是为什么UIL开始加载图像的原因。(实际上,所有行视图都会重新加载),因为这是在getView()中编写的。
要访问行视图及其数据,您可以使用GridView的setOnItemClickListener。在此方法中,您将获得足够的参数,因此可以相应地处理它们。
希望这有所帮助。 谢谢

实际上问题在于图像必须被缓存在内存中,因此重新加载时不应该被注意到。在我更新UIL之后,这个问题得到了一定程度的解决。 - Lingviston
嗨,如果您已经解决了问题,那很好,但是应该避免这种行为,因为它会影响性能,正如如何使用notifyDataSetChanged所述。 - Zealous System
只有在过于频繁地调用notifyDataSetChanged时,性能才会变差。例如,如果您尝试更新适配器项中的进度条。此外,在滚动时尝试更新大型数据集可能会导致性能不足。在其他情况下,根据我的经验,这是不明显的。 - Lingviston
足够好。如果您已经解决了问题,那么应该发布答案,因为它可能会帮助到某些人。 - Zealous System
然而,我的观点是,如果您可以在不使用notifyDataSetChanged的情况下通过获取项目并对其应用选择来实现这一点,那将是一个很好的方法。 - Zealous System

0

也许这对您的需求有用。 https://github.com/koush/UrlImageViewHelper

使用以下代码显示来自URL的图像。

UrlImageViewHelper.setUrlDrawable(holder.imageView2, url,
                    R.drawable.default, new UrlImageViewCallback() {
                        @Override
                        public void onLoaded(ImageView imageView,
                                Bitmap b, String url,
                                boolean loadedFromCache) {
                            // only show the animation
                            // if it was loaded from
                            // network or disk...
                            if (!loadedFromCache) {


                                if (b != null)
                                    holder.imageView2.setImageBitmap(b);

                                // ScaleAnimation scale = new ScaleAnimation(0,
                                // 1,
                                // 0, 1, ScaleAnimation.RELATIVE_TO_SELF,
                                // .5f, ScaleAnimation.RELATIVE_TO_SELF,
                                // .5f);
                                // scale.setDuration(1000);
                                // imageView.startAnimation(scale);
                            } else {

                                if (b != null)
                                    holder.imageView2.setImageBitmap(b);
                            }
                        }
                    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接