在ListView中缓存下载的图像

时间:2015-10-20 02:32:18

标签: android listview android-listview

我有一个带有适配器的ListView,可以从API加载各种数据。其中一个数据是在线图像的URL。我下载图像并在适配器的ImageView中设置它。

问题是,当我在ListView中向上和向下滚动时,图像被重新下载,并且在执行此操作时会出现明显的延迟。此外,一瞬间,它错误地显示错误的图像。

我需要以某种方式缓存这些图像,只下载一次并在ListView中正确设置它们 - 我该怎么做?

编辑: 我使用通用图像加载器加载我的图像:

ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage(imageUrl, viewHolder.thumbnailImageView);

但它似乎没有缓存它们......我是否需要做一些额外的事情?

1 个答案:

答案 0 :(得分:1)

使用ImageLoaders

Glide

ImageView imageView =(ImageView)findViewById(R.id.my_image_view);

Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView);

简单图像加载。检查可以与听众一起使用的链接。

您也可以尝试:

picasso

Android-Universal-Image-Loader

编辑:由于OP说他使用了UIL。

]您应该使用Image Aware。 您可以拥有自己的高缓存内存配置。

 public void initializeImageLoader(final Context sContext) {
        final ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(sContext)
                .memoryCacheExtraOptions(480, 800) // default = device screen dimensions
                .taskExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
                .taskExecutorForCachedImages(AsyncTask.THREAD_POOL_EXECUTOR)
                .threadPoolSize(3) // default
                .threadPriority(Thread.NORM_PRIORITY - 1) // default
                .tasksProcessingOrder(QueueProcessingType.FIFO) // default
                .denyCacheImageMultipleSizesInMemory()
                .memoryCache(new UsingFreqLimitedMemoryCache(50 * 1024 * 1024)) // default
                .memoryCacheSize(50 * 1024 * 1024)
                .imageDownloader(new BaseImageDownloader(sContext)) // default
                .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
                .build();
        ImageLoader.getInstance().init(config);
    }

在获得实例之前使用此初始化。

initializeImageLoader(上下文);  ImageLoader imageLoader = ImageLoader.getInstance();

为您的装载机设置选项。

 final DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.loading)
                .showImageForEmptyUri(R.drawable.noimage)
                .showImageOnFail(R.drawable.noimage)
                .resetViewBeforeLoading(false) //default
                .bitmapConfig(Bitmap.Config.RGB_565)
                .cacheInMemory(true)
                .cacheOnDisk(false) //default
                .build();

并将其设置为您的装载机:

final ImageAware imageAware = new ImageViewAware(viewHolder.thumbnailImageView, false);
imageLoader.displayImage(imageUrl, imageAware, options);