通用图像加载器gridview在notifyDataSetChanged调用后闪烁

时间:2013-09-30 20:55:47

标签: android gridview adapter universal-image-loader

我正在使用UIL和此配置从FILE加载图像:

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以使我的selectionOverlay可见。在此调用之后,所有图像都开始重新加载,这导致GridView闪烁。我怎么能避免这个?

2 个答案:

答案 0 :(得分:3)

我认为你不应该在这种情况下调用 notifyDataSetChanged

在适配器上调用 notifyDataSetChanged 告诉ListView / GridView您的数据已更改,您应该刷新自己。因此,当您调用此方法时,它会自行重新加载并调用适配器的 getView()。这就是UIL开始加载图像的原因。 (实际上所有行重新加载的视图)因为这是用getView()编写的。

要访问行视图及其数据,您可以使用GridView的 setOnItemClickListener 。您将在此方法中获得足够的参数,因此您可以相应地使用它。

我希望这会有所帮助。 感谢

答案 1 :(得分:0)

这可能对您的要求有用。 https://github.com/koush/UrlImageViewHelper

使用以下代码显示来自网址的图片。

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);
                            }
                        }
                    });