8

我正在使用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();

问题:一旦gridview的活动开始一切正常并且图像出现在单元格中,然后我向下滚动网格(网格中有大约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。如果您想查看其他代码(可能是网格适配器)来帮助我解决这个问题,请告诉我。

约翰

4

6 回答 6

16

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

更新:在nostra13的帮助下解决了这个问题,您必须将库更新到1.9 版本并使用这种在以下位置显示图片的方式imageView

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

它解决了我的问题。可以在此处此处找到有关为什么要执行此操作的一些详细信息

于 2013-09-17T09:33:35.593 回答
1

您必须使用 Adapter 然后实现ViewHolder才能使滚动流畅有效。为图像提供标签到他们提供的位置getView(),然后就不会有问题了。

于 2013-07-17T08:28:30.480 回答
1

不要在适配器 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;}
于 2015-10-13T10:19:09.513 回答
1

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

ImageLoader imageLoader = ImageLoader.getInstance();
DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
        .cacheOnDisc(true).resetViewBeforeLoading(true)
        .showImageForEmptyUri(fallbackImage)
        .showImageOnFail(fallbackImage)
        .showImageOnLoading(fallbackImage).build();
于 2016-01-20T13:03:30.020 回答
0

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

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

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

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

于 2014-01-30T12:03:42.127 回答
-1

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

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

if(view==null)........即当你转换 view==null 时才加载图像和 display.them ..这将解决你的问题.....

于 2013-10-19T08:17:38.397 回答