在listView中显示图像

时间:2014-09-30 09:11:35

标签: android listview android-listview

在我的Android应用程序中,我有很多ListView。对于listView的每个项目,我有一个TextView和一个ImageView。

我使用适配器显示项目和AsynTask从服务器下载图像。当我向下滚动ListView时,会下载图像。但是当我向上滚动时,已经下载的图像会再次下载。

我想创建一种图像缓存,你明白我的问题吗?

这是我的ListView的类型:Image + TXT:

http://www.androidhive.info/wp-content/uploads/2012/05/android_custom_listview_onhover.png?7885e2

非常感谢!

6 个答案:

答案 0 :(得分:2)

那是因为你没有缓存图像。每次滚动的项目重新进入视图时,您最终会再次访问服务器以获取图像。想省点麻烦吗?试试Picasso

  

处理Android上图像加载的许多常见缺陷   由毕加索自动完成:

     

在适配器中处理ImageView回收和下载取消   复杂的图像变换,内存使用最少    自动内存和磁盘缓存。

答案 1 :(得分:2)

我强烈建议您使用库进行图片加载,例如Android Universal Image LoaderPicasso

这些库将为您负责加载和缓存。

答案 2 :(得分:0)

制作用户通用图片下载器。     它是加载远程图像和易于使用的最佳库。     参考这个,     https://github.com/nostra13/Android-Universal-Image-Loader

使用方法: 使用下面的行创建实例并加载

ImageLoader imageLoader; //初始化它。

imageLoader.displayImage(imageUri,imageView);

答案 3 :(得分:0)

AQuery 可让您从服务器加载图片并将其设置为ImageView。它还提供了缓存图像文件缓存和内存缓存的选项。点击此处查看AQuery image loading

示例代码:

boolean memCache = false;
boolean fileCache = true;

aq.id(R.id.image1).image("http://example.com/yourImage.png", memCache, fileCache);

它还为以下图像提供回调:

aq.id(R.id.image1).image(imageUrl, true, true, 0, 0, new BitmapAjaxCallback(){
        @Override
        public void callback(String url, ImageView iv, Bitmap bm, AjaxStatus status){
                iv.setImageBitmap(bm);

                //do something to the bitmap
                iv.setColorFilter(tint, PorterDuff.Mode.SRC_ATOP);
        }
});

答案 4 :(得分:0)

SmartImageView是解决此问题的完美解决方案

SmartImageView on github

答案 5 :(得分:0)

对它使用延迟加载,并首先将URL存储在列表视图中,然后按照我在步骤4中的操作进行操作。下面给出了它的步骤:

步骤1:通过以下网址下载通用图片下载jar: http://www.java2s.com/Code/Jar/u/Downloaduniversalimageloaderjar.htm

第2步: - 将此代码放入您的应用程序文件中:

文件cacheDir = com.nostra13.universalimageloader.utils.StorageUtils                 .getCacheDirectory(本);

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
            this)
            .memoryCacheExtraOptions(480, 120)
            // default
            // =
            // device
            // screen
            // dimensions
            .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null)

            .threadPoolSize(3)
            // default
            .threadPriority(Thread.NORM_PRIORITY - 1)
            // default
            .tasksProcessingOrder(QueueProcessingType.FIFO)
            // default

            .denyCacheImageMultipleSizesInMemory()
            .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
            .memoryCacheSize(2 * 1024 * 1024).memoryCacheSizePercentage(13)
            // default
            .discCache(new UnlimitedDiscCache(cacheDir))
            // default

            .discCacheSize(50 * 1024 * 1024).discCacheFileCount(100)
            .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
            .imageDownloader(new BaseImageDownloader(this)) // default
            .imageDecoder(new BaseImageDecoder(true)) // default
            .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
            .writeDebugLogs().build();
    ImageLoader.getInstance().init(config);

第3步: - 将此代码放在您活动的onCreate()中: 私有DisplayImageOptions选项;

    options = new DisplayImageOptions.Builder()
            .showImageOnLoading(R.drawable.iclauncher) // resource or
                                                            // drawable
            .showImageForEmptyUri(R.drawable.iclauncher) // resource or
            // drawable
            .showImageOnFail(R.drawable.iclauncher) // resource or
                                                        // drawable
            .resetViewBeforeLoading(false) // default
            .delayBeforeLoading(1000).cacheInMemory(true) // default
            .cacheOnDisc(true) // default
            .considerExifParams(true) // default
            .imageScaleType(ImageScaleType.IN_SAMPLE_INT) // default
            .bitmapConfig(Bitmap.Config.ARGB_8888) // default
            .displayer(new SimpleBitmapDisplayer()) // default
            .handler(new Handler()) // default
            .build();
    imageLoader = ImageLoader.getInstance();

步骤4: - 将此代码放入适配器中 imageLoader.displayImage(alist.get(位置).getThumbnails(),                     holder.ivImage,options,null); // holder.ivImage是我的图片视图,alist.get(position).getThumbnails()是我的图片网址