Android中的GridView图片异步加载

  1. package android.album.activity;   
  2.   
  3. import java.io.File;   
  4. import java.util.ArrayList;   
  5.   
  6. import android.album.R;   
  7. import android.album.core.AsyncLoadImage;   
  8. import android.album.util.Listeners;   
  9. import android.album.util.MenuID;   
  10. import android.album.util.Public;   
  11. import android.album.util.UnitConverter;   
  12. import android.album.view.BorderImageView;   
  13. import android.app.Activity;   
  14. import android.app.ProgressDialog;   
  15. import android.content.Context;   
  16. import android.content.Intent;   
  17. import android.graphics.Color;   
  18. import android.os.Bundle;   
  19. import android.os.Handler;   
  20. import android.os.Message;   
  21. import android.util.DisplayMetrics;   
  22. import android.view.ContextMenu;   
  23. import android.view.ContextMenu.ContextMenuInfo;   
  24. import android.view.Menu;   
  25. import android.view.MenuItem;   
  26. import android.view.View;   
  27. import android.view.View.OnClickListener;   
  28. import android.view.ViewGroup;   
  29. import android.widget.AdapterView;   
  30. import android.widget.AdapterView.AdapterContextMenuInfo;   
  31. import android.widget.AdapterView.OnItemClickListener;   
  32. import android.widget.BaseAdapter;   
  33. import android.widget.GridView;   
  34. import android.widget.ImageButton;   
  35. import android.widget.ImageView;   
  36. import android.widget.TextView;   
  37.   
  38. /**  
  39.  * ****************************************************************   
  40.  * 文件名称 : ListFolderImages.java   
  41.  * 创建时间 : 2011-7-9 15:00   
  42.  * 文件描述 : 显示指定文件夹下的图片列表   
  43.  * 编写人员 : Bryant  
  44.  *****************************************************************   
  45.  */  
  46. public class ListFolderImagesActivity extends Activity implements  
  47.         OnItemClickListener {   
  48.     private ImageButton btnBack;   
  49.     private TextView tvFolderName;   
  50.   
  51.     /**  
  52.      * 文件夹下的图片列表  
  53.      */  
  54.     private ArrayList<String> imageList = new ArrayList<String>();   
  55.   
  56.     private String folderPath;   
  57.        
  58.     private GridView gridview;   
  59.     private ImageAdapter adapter;   
  60.        
  61.     private int screenWidth;   
  62.        
  63.     private int imageViewWidth;   
  64.     private int imageViewHeight;    
  65.   
  66.     @Override  
  67.     public void onCreate(Bundle savedInstanceState) {   
  68.         super.onCreate(savedInstanceState);   
  69.         setContentView(R.layout.list_folder_images);   
  70.            
  71.         DisplayMetrics dm=new DisplayMetrics();   
  72.         getWindowManager().getDefaultDisplay().getMetrics(dm);   
  73.         screenWidth = dm.widthPixels;   
  74.         imageViewWidth = (screenWidth-UnitConverter.dip2px(this20)) / 3;   
  75.         imageViewHeight = imageViewWidth;   
  76.   
  77.         Intent intent = getIntent();   
  78.         folderPath = intent.getStringExtra("folderPath");   
  79.   
  80.         tvFolderName = (TextView) findViewById(R.id.tvFolderName);   
  81.         tvFolderName.setText(intent.getStringExtra("folderName"));   
  82.   
  83.         // 返回   
  84.         btnBack = (ImageButton) findViewById(R.id.btnBack);   
  85.         btnBack.setOnTouchListener(Listeners.iBtnListener);   
  86.         btnBack.setOnClickListener(new OnClickListener() {   
  87.   
  88.             @Override  
  89.             public void onClick(View v) {   
  90.                 ListFolderImagesActivity.this.finish();   
  91.             }   
  92.   
  93.         });   
  94.   
  95.         startScanImageFolders();   
  96.   
  97.         gridview = (GridView) findViewById(R.id.grid_view);   
  98.         adapter = new ImageAdapter(this);   
  99.         gridview.setAdapter(adapter);   
  100.         gridview.setOnItemClickListener(this);   
  101.         registerForContextMenu(gridview);   
  102.     }   
  103.        
  104.     public void startScanImageFolders(){   
  105.         final ProgressDialog progressDialog = ProgressDialog   
  106.         .show(ListFolderImagesActivity.this,ListFolderImagesActivity.this.getString(R.string.waiting),   
  107.                 ListFolderImagesActivity.this.getString(R.string.folder_scanning), false);   
  108.         new Thread() {   
  109.             public void run() {   
  110.                 imageList = getImagesFromFolder(folderPath);   
  111.                    
  112.                 Message message = new Message();   
  113.                 message.what = 1;   
  114.                 handler.sendMessage(message);   
  115.                    
  116.                 progressDialog.dismiss();   
  117.             }   
  118.         }.start();     
  119.     }   
  120.   
  121.   
  122.   
  123.     /**  
  124.      * 获取指定文件夹中的图片  
  125.      *   
  126.      * @return  
  127.      */  
  128.     public static ArrayList<String> getImagesFromFolder(String folderPath) {   
  129.         ArrayList<String> imageList = new ArrayList<String>();   
  130.   
  131.         File file = new File(folderPath);   
  132.         File[] files = file.listFiles(new ImageFileFilter());   
  133.   
  134.         for (File f : files) {   
  135.             imageList.add(f.getPath());   
  136.         }   
  137.   
  138.         return imageList;   
  139.     }   
  140.   
  141.     public class ImageAdapter extends BaseAdapter {   
  142.         private Context mContext;   
  143.   
  144.         public ImageAdapter(Context c) {   
  145.             mContext = c;   
  146.         }   
  147.   
  148.         public int getCount() {   
  149.             return imageList.size();   
  150.         }   
  151.   
  152.         public Object getItem(int position) {   
  153.             return imageList.get(position);   
  154.         }   
  155.   
  156.         public long getItemId(int position) {   
  157.             return position;   
  158.         }   
  159.   
  160.         public View getView(int position, View convertView, ViewGroup parent) {            
  161.             if (convertView == null) {         
  162.                 final ImageView imageView;   
  163.                 imageView = new BorderImageView(mContext, Color.GRAY);   
  164.                 imageView.setLayoutParams(new GridView.LayoutParams(imageViewWidth, imageViewHeight));   
  165.                 imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);   
  166.                    
  167.                 convertView = imageView;   
  168.                
  169.                 imageLoader.loadDrawable(imageList.get(position), new ImageCallback() {   
  170.   
  171.                     public void imageLoaded(Drawable imageDrawable, String imageUrl) {   
  172.                         imageView.setImageDrawable(imageDrawable);   
  173.                     }   
  174.                 });    
  175.             }   
  176.                
  177.             return convertView;   
  178.         }   
  179.     }   
  180.   
  181.        
  182.      * 刷新UI   
  183.      */   
  184.     final Handler handler = new Handler() {   
  185.         public void handleMessage(Message msg) {   
  186.             switch (msg.what) {   
  187.             case 1:   
  188.                 adapter.notifyDataSetChanged();   
  189.                 break;   
  190.             }   
  191.             super.handleMessage(msg);   
  192.         }   
  193.     };   
  194. }   
  195. public class AsyncImageLoader {   
  196.     private Map<String, SoftReference<Drawable>> imageCache=new HashMap<String, SoftReference<Drawable>>();   
  197.        
  198.     public Drawable loadDrawable(final String imageUrl,final ImageCallback callback){   
  199.         if(imageCache.containsKey(imageUrl)){   
  200.             SoftReference<Drawable> softReference=imageCache.get(imageUrl);   
  201.             if(softReference.get()!=null){   
  202.                 return softReference.get();   
  203.             }   
  204.         }   
  205.         final Handler handler=new Handler(){   
  206.             @Override  
  207.             public void handleMessage(Message msg) {   
  208.                 callback.imageLoaded((Drawable) msg.obj, imageUrl);   
  209.             }   
  210.         };   
  211.         new Thread(){   
  212.             public void run() {   
  213.                 Drawable drawable=loadImageFromUrl(imageUrl);   
  214.                 imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));   
  215.                 handler.sendMessage(handler.obtainMessage(0,drawable));   
  216.             };   
  217.         }.start();   
  218.         return null;   
  219.     }   
  220.        
  221.     protected Drawable loadImageFromUrl(String imageUrl) {   
  222.         try {   
  223.             return Drawable.createFromPath(imageUrl);   
  224.         } catch (Exception e) {   
  225.             throw new RuntimeException(e);   
  226.         }   
  227.     }   
  228.   
  229.     public interface ImageCallback{   
  230.         public void imageLoaded(Drawable imageDrawable,String imageUrl);   
  231.     }   
  232. }  

你可能感兴趣的:(android,图片,GridView,异步加载)