【问题标题】:Android-Universal-Image-Loader doesn't keep loaded images on scroll in gridviewAndroid-Universal-Image-Loader 不会在 gridview 中滚动加载的图像
【发布时间】:2013-07-15 16:56:38
【问题描述】:

我正在使用Android-Universal-Image-Loader 库将远程图片加载到我的 GridView 单元格中的 ImageView。

这里是imageLoader的配置:

new ImageLoaderConfiguration.Builder(Config.context)
.threadPriority(Thread.NORM_PRIORITY - 2)
.memoryCacheSize(20 * 1024 * 1024) // 20 Mb
.memoryCache(new LruMemoryCache(20 * 1024 * 1024))
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.tasksProcessingOrder(QueueProcessingType.LIFO)
.enableLogging() // Not necessary in common
.build();

和显示选项:

new DisplayImageOptions.Builder()
.showStubImage(R.drawable.blank)
.showImageForEmptyUri(R.drawable.no_image)
.build();

问题: 一旦网格视图的活动开始一切正常并且图像出现在单元格中, 然后我向下滚动网格(网格中有大约 20 个项目),其他图像正确加载。 但是一旦我滚动顶部已经加载的图像再次开始加载。

在上下滚动几下后,网格会保存所有图像,并且它们不再消失。

有没有人遇到过类似的问题,或者你知道我做错了什么。 感谢您的帮助。

添加: 这是我的适配器中的 getView 方法:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    View view = convertView;
    ViewHolder holder;

    if ( view == null ) {           
        view = Config.context.getLayoutInflater().inflate(R.layout.featured, null);
        holder = new ViewHolder();

        holder.titleText = (TextView) view.findViewById(R.id.featured_title);
        holder.priceText = (TextView) view.findViewById(R.id.featured_price);
        holder.image = (ImageView) view.findViewById(R.id.thumbnail_image);

        view.setTag(holder);
    }
    else {
        holder = (ViewHolder) view.getTag();
    }

    HashMap<String, String> listing = listings.get(position);

    /* set text values */
    holder.titleText.setText(listing.get("title"));
    holder.priceText.setText(listing.get("price"));

    /* load image to list (AsyncTask) */
    Utils.imageLoaderFeatured.displayImage(listing.get("photo"), holder.image, Utils.imageLoaderOptionsFeatured);

    return view;
}

PS。如果您想查看其他代码(可能是网格适配器)来帮助我解决此问题,请告诉我。

约翰

【问题讨论】:

  • 据我所知,您不在内存或磁盘上使用缓存。尝试在显示选项中启用缓存。
  • 我之前使用过它,但在将库更新到 1.8.5 版本后将其删除,因为 .cacheInMemory() 和 .cacheOnDisc() 已被弃用,即使使用 .cacheInMemory() 图片也不会保留第一次,用户应该在应用程序缓存网格中的所有图片之前向上和向下滚动至少 4 次。
  • 您应该阅读那些不推荐使用的方法的 Java 文档。所以你可以看到你应该使用.cacheInMemory(true).cacheOnDisc(true) 来代替。您是否在 UIL 示例应用中看到了您的问题?
  • 您好 NOSTRA,感谢您对弃用问题的澄清,我得到并更正了,但问题仍然存在,并且 UIL 示例应用程序中的网格中的行为相同。我在三星galaxy nexus 和三星n800 平板电脑上进行了测试,仅在网格视图中,列表视图可以正确保存图片。如果你愿意,我可以尝试录制视频。
  • 您好,Nostra,问题仍然存在于库中,请检查...

标签: android image loader universal universal-image-loader


【解决方案1】:

我在 Universal-Image-Loader Demo 上也遇到过同样的问题,希望库开发者在下一次更新中解决这个问题。

更新:在nostra13的帮助下解决了这个问题,你必须将库更新到1.9 version并使用imageView中的这种显示图片的方式:

ImageAware imageAware = new ImageViewAware(imageView, false);
imageLoader.displayImage(imageUri, imageAware);

它解决了我的问题。可以在 herehere 找到有关为什么要这样做的一些详细信息

【讨论】:

  • 我试过这个 - 但它产生了在要加载的图像位置显示已加载图像的问题,而不是显示占位符,并且在某些时候加载正确的图像
【解决方案2】:

您必须使用适配器然后执行ViewHolder 才能使滚动的Flow 流畅有效。 在getView() 中提供的位置为图像提供标签,然后就没有问题了。

【讨论】:

  • 嗨 Anchit,感谢您的回答,但我正在使用 viewHolder 并按照您的描述进行操作。我已经在帖子中添加了getView方法,可以看看吗?
【解决方案3】:

不要在适配器 getView() 方法中使用 set 标记。始终尝试在适配器 getview() 方法中查找视图 ID。

public View getView(final int position, View convertView, ViewGroup parent) {

View view = convertView;
ViewHolder holder;


    view = Config.context.getLayoutInflater().inflate(R.layout.featured, null);
    holder = new ViewHolder();

    holder.titleText = (TextView) view.findViewById(R.id.featured_title);
    holder.priceText = (TextView) view.findViewById(R.id.featured_price);
    holder.image = (ImageView) view.findViewById(R.id.thumbnail_image);

    view.setTag(holder);



HashMap<String, String> listing = listings.get(position);

/* set text values */
holder.titleText.setText(listing.get("title"));
holder.priceText.setText(listing.get("price"));

/* load image to list (AsyncTask) */
Utils.imageLoaderFeatured.displayImage(listing.get("photo"), holder.image, Utils.imageLoaderOptionsFeatured);

return view;}

【讨论】:

  • 这在我看来是一个不错的答案,但请不要专门要求点赞 - 如果您创作了好的内容,您会及时获得。
【解决方案4】:

您应该只声​​明一次 ImageLoader 和 DisplayImageOptions 实例。可能在构造函数中。

ImageLoader imageLoader = ImageLoader.getInstance();
DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
        .cacheOnDisc(true).resetViewBeforeLoading(true)
        .showImageForEmptyUri(fallbackImage)
        .showImageOnFail(fallbackImage)
        .showImageOnLoading(fallbackImage).build();

【讨论】:

    【解决方案5】:

    同样的问题,使用 StaggeredGridView。 即使使用内存缓存和 ImageAware 方法,也无法解决。

    唯一对我有用的是将缓存从 4 MB 扩展到 10 MB。列表图像很小,但我有一个非常大的图像作为视图的标题。

    我注意到图像视图在长按时也会刷新,这对 GridView 也有效吗?

    无论如何,扩大内存缓存限制也解决了这个问题。

    【讨论】:

      【解决方案6】:

      .i 也面临同样的问题,并通过写作解决了问题

      Utils.imageLoaderFeatured.displayImage(listing.get("photo"), holder.image, Utils.imageLoaderOptionsFeatured);.......

      line inside if(view==null)........即当你转换 view==null 时才加载图像并显示它们..这将解决你的问题.....

      【讨论】:

      • 谢谢哥们,我已经尝试过这种方式,在这种情况下图像总是会改变,这意味着每次滚动网格时它们都会混淆。
      猜你喜欢
      • 1970-01-01
      • 2020-03-24
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 2014-05-19
      • 2012-11-19
      相关资源
      最近更新 更多