GridView异步加载本地图片缩略图
2012-06-05 22:40
411 查看
main.xml
AsyncLoadedImageActivity.java
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <GridView android:id="@+id/sdcard" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:numColumns="4" android:stretchMode="columnWidth" android:verticalSpacing="1dp" android:horizontalSpacing="1dp" /> </FrameLayout>
AsyncLoadedImageActivity.java
package com.pic.demo; import java.io.File; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.media.ThumbnailUtils; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; import android.widget.Toast; public class AsyncLoadedImageActivity extends Activity { private GridView sdcardImages; private FileAdapter fileAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.main); setupViews(); setProgressBarIndeterminateVisibility(true); new AsyncLoadedImage().execute(); } /* * 初始化文件浏览View */ private void setupViews() { sdcardImages = (GridView) findViewById(R.id.sdcard); sdcardImages.setOnItemClickListener(new fileListener()); fileAdapter = new FileAdapter(getApplicationContext()); sdcardImages.setAdapter(fileAdapter); } /* * 释放Bitmap内存 */ protected void onDestroy() { super.onDestroy(); final GridView grid = sdcardImages; final int count = grid.getChildCount(); ImageView v = null; for (int i = 0; i < count; i++) { v = (ImageView) grid.getChildAt(i); ((BitmapDrawable) v.getDrawable()).setCallback(null); } } /* * 刷新Adapter */ private void addImage(LoadedImage... value) { for (LoadedImage image : value) { fileAdapter.addPhoto(image); fileAdapter.notifyDataSetChanged(); } } /* * 点击监听 */ class fileListener implements OnItemClickListener { public void onItemClick(AdapterView<?> paramAdapterView, View paramView, int paramInt, long paramLong) { LoadedImage loadedImage = (LoadedImage) sdcardImages.getItemAtPosition(paramInt); showMsg(""+loadedImage.getPicPath()); Intent intentPicView = new Intent(getBaseContext(), PictureView.class); intentPicView.putExtra("picPath", loadedImage.getPicPath()); startActivity(intentPicView); } } /* * 异步加载缩略图到LoadedImage然后调用addImage方法更新Adapter */ class AsyncLoadedImage extends AsyncTask<Object, LoadedImage, Object> { @Override protected Object doInBackground(Object... params) { String path = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/hfdatabase/3/img"; path = Environment.getExternalStorageDirectory().getPath() + "/" + "picture"; // path=Environment.getExternalStorageDirectory().getPath() + // "/"+"image" ; path = Environment.getExternalStorageDirectory().getPath(); File file = new File(path); if (!file.exists()) { file.mkdirs(); } else { File[] files = file.listFiles(); String[] paths = new String[files.length]; Bitmap bitmap; Bitmap newBitmap; for (int i = 0; i < files.length; i++) { paths[i] = files[i].getPath(); try { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 10; bitmap = BitmapFactory.decodeFile(paths[i], options); newBitmap = ThumbnailUtils.extractThumbnail(bitmap, 120, 120); bitmap.recycle(); if (newBitmap != null) { publishProgress(new LoadedImage(newBitmap,paths[i] )); } } catch (Exception e) { e.printStackTrace(); } } } return null; } //实时更新UI onProgressUpdate()方法的参数对应于doInBackground中publishProgress方法的参数,同时也对应于 //doInBackground的第二个参数 @Override public void onProgressUpdate(LoadedImage... value) { addImage(value); } //更新UI结束后的处理 @Override protected void onPostExecute(Object result) { setProgressBarIndeterminateVisibility(false); } } /* * Adapter */ class FileAdapter extends BaseAdapter { private Context mContext; private ArrayList<LoadedImage> photos = new ArrayList<LoadedImage>(); public FileAdapter(Context context) { mContext = context; } public void addPhoto(LoadedImage photo) { photos.add(photo); } public int getCount() { return photos.size(); } public Object getItem(int position) { return photos.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { final ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); } else { imageView = (ImageView) convertView; } imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); imageView.setPadding(0, 1, 1, 1); imageView.setImageBitmap(photos.get(position).getBitmap()); return imageView; } } /* * 这是个保存bitmap的类,加入Adapter的ArrayList中,随着addImage更新Adapter */ private static class LoadedImage { String picPath; Bitmap mBitmap; LoadedImage(Bitmap bitmap,String picPath ) { this.mBitmap = bitmap; this.picPath=picPath; } public Bitmap getBitmap() { return mBitmap; } public String getPicPath() { return picPath; } } /* * 消息提示 */ private Toast toast; public void showMsg(String arg) { if (toast == null) { toast = Toast.makeText(this, arg, Toast.LENGTH_SHORT); } else { toast.cancel(); toast.setText(arg); } toast.show(); } }
相关文章推荐
- GridView异步加载本地图片以及全选/反选删除功能
- ListView GridView ViewPager 异步 加载网络图片 缓存到本地
- ListView与GridView异步加载图片
- Unity+NGUI打造网络图片异步加载与本地缓存工具类(二)
- android 异步加载图片缩略图
- listView或者gridView异步加载图片错乱问题
- 安卓GridView异步加载网络图片
- Android GridView 异步加载图片
- android gridview 异步加载图片
- 进一步优化Android ListView GridView中异步加载图片
- Android完美解决GridView异步加载图片和加载大量图片时出现Out Of Memory问题
- android之图片异步加载并缓存到本地
- 异步加载本地 图片
- Android实现图片异步加载并缓存到本地
- ImageLoader 加载本地图片与视频的缩略图
- webService异步加载GridView中图片
- 实现异步加载本地图片,防止oom错误
- Android使用GridView异步加载(弱引用)网络图片(支持点击查看)
- ListView与GridView异步加载图片
- GridView 加载本地某个文件夹下的所有图片