参照网上代码,使用AsyncTask和Adapter实现图片异步加载
继承BaseAdapter类自定义Adapter类
使用mLayoutInFlater实现动态加载布局
使用getTag()与setTag()优化Item的加载
private Context mContext;
private LayoutInflater mLayoutInFlater=null;
private List<String> mList=null;
private int width=120;
private int height=150;
public static class MyGridViewHolder{
public ImageView imageview_thumbnail;
public TextView textview_test;
}
public MyGridViewAdapter(Context context,List<String> list){
this.mContext=context;
this.mList=list;
mLayoutInFlater= LayoutInflater.from(context);
}
@Override
public int getCount(){
return mList.size();
}
@Override
public Object getItem(int arg0){
return null;
}
@Override
public long getItemId(int position){
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyGridViewHolder viewHolder = null;
if (convertView == null) {
viewHolder = new MyGridViewHolder();
convertView = mLayoutInFlater.inflate(R.layout.layout_my_gridview_item, null);
viewHolder.imageview_thumbnail = (ImageView) convertView.findViewById(R.id.imageview_thumbnail);
viewHolder.textview_test = (TextView) convertView.findViewById(R.id.textview_test);
convertView.setTag(viewHolder);
} else
viewHolder = (MyGridViewHolder) convertView.getTag();
String url=mList.get(position);
//需要加载的图片已经在加载,不用添加线程加载
//如果不是加载需要的图片,取消线程,创建线程加载需要的图片
if(cancelPotentialLoad(url,viewHolder.imageview_thumbnail)){
AsyncLoadImageTask task=new AsyncLoadImageTask(viewHolder.imageview_thumbnail); //创建线程 加载图片
LoadedDrawable loadedDrawable=new LoadedDrawable(task); //记录加载任务
viewHolder.imageview_thumbnail.setImageDrawable(loadedDrawable); //设置图片
task.execute(position);
}
viewHolder.textview_test.setText((position+1)+""); //设置文本
return convertView;
}
使用AsyncTask异步加载图片,并自定义函数检测,防止多个线程同时加载图片
private class AsyncLoadImageTask extends AsyncTask<Integer,Void,Bitmap> {
private String url=null;
private final WeakReference<ImageView> imageViewWeakReference;
public AsyncLoadImageTask(ImageView imageview){
super();
imageViewWeakReference=new WeakReference<ImageView>(imageview);
}
protected Bitmap doInBackground(Integer... params){ //将图片和地址存入map
Bitmap bitmap=null;
this.url=mList.get(params[0]);
bitmap=getBitmapFromUrl(url); //获取图片
MainActivity.gridviewBitmapCaches.put(mList.get(params[0]),bitmap);
return bitmap;
}
protected void onPostExecute(Bitmap resultBitmap){ //将图片放入imageview??
if(isCancelled()){
resultBitmap=null;
}
if(imageViewWeakReference!=null){
ImageView imageView=imageViewWeakReference.get();
AsyncLoadImageTask loadImageTask=getAsyncLoadImageTask(imageView);
if(this==loadImageTask){
imageView.setImageBitmap(resultBitmap);
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
}
}
super.onPostExecute(resultBitmap);
}
}
定义函数压缩图片,节约内存
public static Bitmap getBitmapThumbnail(String path, int width, int height) {
Bitmap bitmap = null;
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, opts);
opts.inSampleSize = Math.max((int) (opts.outHeight / (float) height), (int) (opts.outWidth / (float) width));
opts.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeFile(path, opts);
return bitmap;
}
public static Bitmap getBitmapThumbnail(Bitmap bmp,int width,int height){
Bitmap bitmap=null;
if(bmp!=null){
int bmpWidth=bmp.getWidth();
int bmpHeight=bmp.getHeight();
if(width!=0&&height!=0){
Matrix matrix=new Matrix();
float scaleWidth=((float)width/bmpWidth);
float scaleHeight=((float)height/bmpHeight);
matrix.postScale(scaleWidth,scaleHeight);
bitmap=Bitmap.createBitmap(bmp,0,0,bmpWidth,bmpHeight,matrix,true);
}
else{
bitmap=bmp;
}
}
return bitmap;
}
文章摘自:
http://blog.csdn.net/jia516967927/article/details/50730502