【问题标题】:Universal Image Loader gridview blinks after notifyDataSetChanged call通用图像加载器网格视图在 notifyDataSetChanged 调用后闪烁
【发布时间】:2013-09-30 20:55:47
【问题描述】:

我正在使用带有此配置的 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 闪烁。我怎样才能避免这种情况?

【问题讨论】:

    标签: android gridview adapter universal-image-loader


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 实际上问题是图像必须缓存在内存中,因此重新加载必须不明显。这个问题在我更新 UIL 后以某种方式解决了。
    • 嗨,如果您已经解决了问题,那么它很好,但是由于性能问题,应该避免这种行为,因为它提到了 notifyDataSetChanged 的​​工作原理。
    • 只有在经常调用 notifyDataSetChanged 时,性能才会变差。例如,如果您尝试更新适配器项目中的进度条。当您在滚动时尝试更新大型数据集时,性能不足可能会很明显。在其他情况下,根据我的经验,这并不明显。
    • 足够好。如果您已经解决了问题,那么您应该发布答案,因为它可能对某些人有所帮助。
    • 但是我的观点是,如果您可以通过获取项目并将选择应用于它而不使用 notifyDataSetChanged 来实现这一点,那么它可能会有一个很好的。
    【解决方案2】:

    这可能对您的要求有用。 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);
                                }
                            }
                        });
    

    【讨论】:

      猜你喜欢
      • 2014-08-18
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2014-05-08
      • 2014-01-10
      • 1970-01-01
      相关资源
      最近更新 更多