Android中的GridView图片异步加载
package android.album.activity;
import java.io.File;
import java.util.ArrayList;
import android.album.R;
import android.album.core.AsyncLoadImage;
import android.album.util.Listeners;
import android.album.util.MenuID;
import android.album.util.Public;
import android.album.util.UnitConverter;
import android.album.view.BorderImageView;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
/**
* ****************************************************************
* 文件名称 : ListFolderImages.java
* 创建时间 : 2011-7-9 15:00
* 文件描述 : 显示指定文件夹下的图片列表
* 编写人员 : Bryant
*****************************************************************
*/
public class ListFolderImagesActivity extends Activity implements
OnItemClickListener {
private ImageButton btnBack;
private TextView tvFolderName;
/**
* 文件夹下的图片列表
*/
private ArrayList<String> imageList = new ArrayList<String>();
private String folderPath;
private GridView gridview;
private ImageAdapter adapter;
private int screenWidth;
private int imageViewWidth;
private int imageViewHeight;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_folder_images);
DisplayMetrics dm=new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels;
imageViewWidth = (screenWidth-UnitConverter.dip2px(this, 20)) / 3;
imageViewHeight = imageViewWidth;
Intent intent = getIntent();
folderPath = intent.getStringExtra("folderPath");
tvFolderName = (TextView) findViewById(R.id.tvFolderName);
tvFolderName.setText(intent.getStringExtra("folderName"));
// 返回
btnBack = (ImageButton) findViewById(R.id.btnBack);
btnBack.setOnTouchListener(Listeners.iBtnListener);
btnBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ListFolderImagesActivity.this.finish();
}
});
startScanImageFolders();
gridview = (GridView) findViewById(R.id.grid_view);
adapter = new ImageAdapter(this);
gridview.setAdapter(adapter);
gridview.setOnItemClickListener(this);
registerForContextMenu(gridview);
}
public void startScanImageFolders(){
final ProgressDialog progressDialog = ProgressDialog
.show(ListFolderImagesActivity.this,ListFolderImagesActivity.this.getString(R.string.waiting),
ListFolderImagesActivity.this.getString(R.string.folder_scanning), false);
new Thread() {
public void run() {
imageList = getImagesFromFolder(folderPath);
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
progressDialog.dismiss();
}
}.start();
}
/**
* 获取指定文件夹中的图片
*
* @return
*/
public static ArrayList<String> getImagesFromFolder(String folderPath) {
ArrayList<String> imageList = new ArrayList<String>();
File file = new File(folderPath);
File[] files = file.listFiles(new ImageFileFilter());
for (File f : files) {
imageList.add(f.getPath());
}
return imageList;
}
public class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return imageList.size();
}
public Object getItem(int position) {
return imageList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
final ImageView imageView;
imageView = new BorderImageView(mContext, Color.GRAY);
imageView.setLayoutParams(new GridView.LayoutParams(imageViewWidth, imageViewHeight));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
convertView = imageView;
imageLoader.loadDrawable(imageList.get(position), new ImageCallback() {
public void imageLoaded(Drawable imageDrawable, String imageUrl) {
imageView.setImageDrawable(imageDrawable);
}
});
}
return convertView;
}
}
* 刷新UI
*/
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
adapter.notifyDataSetChanged();
break;
}
super.handleMessage(msg);
}
};
}
public class AsyncImageLoader {
private Map<String, SoftReference<Drawable>> imageCache=new HashMap<String, SoftReference<Drawable>>();
public Drawable loadDrawable(final String imageUrl,final ImageCallback callback){
if(imageCache.containsKey(imageUrl)){
SoftReference<Drawable> softReference=imageCache.get(imageUrl);
if(softReference.get()!=null){
return softReference.get();
}
}
final Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
callback.imageLoaded((Drawable) msg.obj, imageUrl);
}
};
new Thread(){
public void run() {
Drawable drawable=loadImageFromUrl(imageUrl);
imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
handler.sendMessage(handler.obtainMessage(0,drawable));
};
}.start();
return null;
}
protected Drawable loadImageFromUrl(String imageUrl) {
try {
return Drawable.createFromPath(imageUrl);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public interface ImageCallback{
public void imageLoaded(Drawable imageDrawable,String imageUrl);
}
}