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

4

2 回答 2

3

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

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

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

我希望这有帮助。谢谢

于 2015-04-08T10:53:28.077 回答
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);
                            }
                        }
                    });
于 2015-02-09T10:53:24.070 回答