使用开源imageLoader优化listview加载大量本地图片的demo

  1. package com.example.listviewdemo;    
  2.     
  3. import java.util.ArrayList;    
  4. import java.util.Collections;    
  5. import java.util.LinkedList;    
  6. import java.util.List;    
  7.     
  8. import android.database.Cursor;    
  9. import android.graphics.Bitmap;    
  10. import android.os.Bundle;    
  11. import android.provider.MediaStore;    
  12. import android.view.View;    
  13. import android.view.ViewGroup;    
  14. import android.widget.BaseAdapter;    
  15. import android.widget.ImageView;    
  16. import android.widget.ListView;    
  17. import android.widget.TextView;    
  18.     
  19. import com.nostra13.universalimageloader.core.DisplayImageOptions;    
  20. import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;    
  21. import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;    
  22. import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;    
  23. import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;    
  24. import com.smalt.smaltmap.utils.GlobalConstant;    
  25.     
  26. /**  
  27.  *   
  28.  * @Title:  
  29.  * @Description:ListView显示大量图片  
  30.  * @Copyright: Copyright (c) 2014  
  31.  * @Company:   
  32.  * @author: Administrator  
  33.  * @version: 1.0.0.0  
  34.  * @Date: 2014-2-14  
  35.  */    
  36. public class MainActivity01 extends AbsListViewBaseActivity {    
  37.     DisplayImageOptions options; // 配置图片加载及显示选项    
  38.     ListView lvShow;    
  39.     /**  
  40.      * 存储图片地址  
  41.      */    
  42.     ArrayList<String> listImgPath;    
  43.     String[] imageUriArray;    
  44.     
  45.     @Override    
  46.     protected void onCreate(Bundle savedInstanceState) {    
  47.         super.onCreate(savedInstanceState);    
  48.         setContentView(R.layout.activity_main);    
  49.         lvShow = (ListView) findViewById(R.id.lv_show);    
  50.         // 扫描内存中图片并存入list    
  51.     
  52.         listImgPath = getImgPathList();    
  53.         if (listImgPath.size() < 1) {    
  54.             GlobalConstant.i("sd卡中无图片");    
  55.         } else {    
  56.             // list转成数组    
  57.             imageUriArray = (String[]) listImgPath    
  58.                     .toArray(new String[listImgPath.size()]);    
  59.             // 配置图片加载及显示选项(还有一些其他的配置,查阅doc文档吧)    
  60.             options = new DisplayImageOptions.Builder()    
  61.                     .showStubImage(R.drawable.ic_launcher) // 在ImageView加载过程中显示图片    
  62.                     .showImageForEmptyUri(R.drawable.ic_launcher) // image连接地址为空时    
  63.                     .showImageOnFail(R.drawable.ic_launcher) // image加载失败    
  64.                     .cacheInMemory(true// 加载图片时会在内存中加载缓存    
  65.                     .cacheOnDisc(true// 加载图片时会在磁盘中加载缓存    
  66.                     .displayer(new RoundedBitmapDisplayer(20)) // 设置用户加载图片task(这里是圆角图片显示)    
  67.                     .build();    
  68.             // 加载适配器    
  69.             lvShow.setAdapter(new AdapterList());    
  70.         }    
  71.     
  72.     }    
  73.         
  74.     
  75.     @Override    
  76.     public void onBackPressed() {    
  77.         AnimateFirstDisplayListener.displayedImages.clear();    
  78.         super.onBackPressed();    
  79.     }    
  80.     
  81.     /**  
  82.      *   
  83.      * 获取图片地址列表  
  84.      *   
  85.      * @return list  
  86.      */    
  87.     private ArrayList<String> getImgPathList() {    
  88.         ArrayList<String> list = new ArrayList<String>();    
  89.         Cursor cursor = getContentResolver().query(    
  90.                 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,    
  91.                 new String[] { "_id""_data" }, nullnullnull);    
  92.         while (cursor.moveToNext()) {    
  93.             list.add(cursor.getString(1));// 将图片路径添加到list中    
  94.         }    
  95.         cursor.close();    
  96.         return list;    
  97.     }    
  98.     
  99.     /** 图片加载监听事件 **/    
  100.     private static class AnimateFirstDisplayListener extends    
  101.             SimpleImageLoadingListener {    
  102.     
  103.         static final List<String> displayedImages = Collections    
  104.                 .synchronizedList(new LinkedList<String>());    
  105.     
  106.         @Override    
  107.         public void onLoadingComplete(String imageUri, View view,    
  108.                 Bitmap loadedImage) {    
  109.             if (loadedImage != null) {    
  110.                 ImageView imageView = (ImageView) view;    
  111.                 boolean firstDisplay = !displayedImages.contains(imageUri);    
  112.                 if (firstDisplay) {    
  113.                     FadeInBitmapDisplayer.animate(imageView, 500); // 设置image隐藏动画500ms    
  114.                     displayedImages.add(imageUri); // 将图片uri添加到集合中    
  115.                 }    
  116.             }    
  117.         }    
  118.     }    
  119.     
  120.     /**  
  121.      *   
  122.      * @Title:  
  123.      * @Description:listview适配器  
  124.      * @Copyright: Copyright (c) 2014  
  125.      * @Company:   
  126.      * @author: Administrator  
  127.      * @version: 1.0.0.0  
  128.      * @Date: 2014-2-14  
  129.      */    
  130.     class AdapterList extends BaseAdapter {    
  131.         private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();    
  132.     
  133.             
  134.     
  135.         @Override    
  136.         public int getCount() {    
  137.             // TODO Auto-generated method stub    
  138.             return imageUriArray.length;    
  139.         }    
  140.     
  141.         /**  
  142.          * 构造方法  
  143.          */    
  144.         public AdapterList() {    
  145.             // TODO Auto-generated constructor stub    
  146.         }    
  147.     
  148.             
  149.         @Override    
  150.         public Object getItem(int arg0) {    
  151.             // TODO Auto-generated method stub    
  152.             return arg0;    
  153.         }    
  154.     
  155.         /*  
  156.          * (non-Javadoc)  
  157.          *   
  158.          * @see android.widget.Adapter#getItemId(int)  
  159.          */    
  160.         @Override    
  161.         public long getItemId(int arg0) {    
  162.             // TODO Auto-generated method stub    
  163.             return arg0;    
  164.         }    
  165.     
  166.         /*  
  167.          * (non-Javadoc)  
  168.          *   
  169.          * @see android.widget.Adapter#getView(int, android.view.View,  
  170.          * android.view.ViewGroup)  
  171.          */    
  172.         @Override    
  173.         public View getView(int position, View convertView, ViewGroup parent) {    
  174.             ViewHolder holder;    
  175.             if (convertView == null) {    
  176.                 holder = new ViewHolder();    
  177.                 // 初始化绑定控件    
  178.                 convertView = getLayoutInflater().inflate(R.layout.layout_item, null);    
  179.                 holder.imgShow = (ImageView) findViewById(R.id.img_show);    
  180.                 holder.tvShow = (TextView) findViewById(R.id.tv_show);    
  181.                 // add to convertView    
  182.                 convertView.setTag(holder);    
  183.             } else {    
  184.                 holder = (ViewHolder) convertView.getTag();    
  185.             }    
  186.     
  187.             // 设置img,text具体显示的内容    
  188.     
  189.             holder.tvShow.setText("fuck" + (position));    
  190.     
  191.             imageLoader.displayImage(imageUriArray[position], holder.imgShow,    
  192.                     options, animateFirstListener);    
  193.             return convertView;    
  194.         }    
  195.     }    
  196.     
  197.     static class ViewHolder {    
  198.         ImageView imgShow;    
  199.         TextView tvShow;    
  200.     }    
  201. }

下载地址:http://pan.baidu.com/s/1pJyjlxh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值