package com.worldchip.apk; import java.io.File; import java.util.ArrayList; import java.util.LinkedList; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.media.ThumbnailUtils; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore.Images.Thumbnails; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; 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 ImageGridView extends Activity{ private GridView sdcardImages; private FileAdapter fileAdapter; private Drawable drawable; int flag=2; String[] albums=null; String[] paths ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.grid_view); setupViews(); setProgressBarIndeterminateVisibility(true); paths = getNames(flag, albums); new AsyncLoadedImage().execute(); } /* * 釋放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); v.getDrawable().setCallback(null); } } /* * 初始化文件瀏覽View */ private void setupViews() { Intent intent = getIntent(); final String path = intent.getStringExtra("path"); String name = intent.getStringExtra("name"); flag=intent.getIntExtra("flag",1); albums=intent.getStringArrayExtra("data"); sdcardImages = (GridView) this.findViewById(R.id.gridview); drawable = sdcardImages.getBackground(); fileAdapter = new FileAdapter(getApplicationContext()); sdcardImages.setAdapter(fileAdapter); sdcardImages.setOnItemClickListener(new OnItemClickListener(){ public void onItemClick(AdapterView<?> arg0, View arg1, int position,long id) { //Log.i("GridView.setOnItemClickListener", "position="+position); //String path=images.get(position).path; //Log.i("ImageListView_onListItemClick", "the path="+path); ArrayList<String> pathArray=new ArrayList<String>(); for(int i=0; i<albums.length; i++) { if(flag==2) { pathArray.add(albums[i]); } else { String absolutePath=albums[i].split("&")[1]; // Log.i(TAG, "absolutePath="+absolutePath); pathArray.add(absolutePath); } } Intent intent = new Intent(); intent.setClass(ImageGridView.this, ImageGalleryView.class); intent.putExtra("path", path); intent.putExtra("id", position); intent.putExtra("data", (String[])pathArray.toArray(new String[pathArray.size()])); Log.i("ImageGridView_setOnItemClickListener", "position="+position+"; path="+path); ImageGridView.this.startActivity(intent); } }); } /* * 刷新Adapter */ private void addImage(LoadedImage... value) { for (LoadedImage image : value) { fileAdapter.addPhoto(image); fileAdapter.notifyDataSetChanged(); } } private String[] getNames(int flag, String[] albums) { if(flag==0) { // Log.i(TAG, "----code comes to here----"); String[] paths=new String[albums.length]; String path=null; String name=null; for(int i=0; i<albums.length; i++) { path=albums[i].split("&")[1]; name=path.substring(path.lastIndexOf("/")+1); // Log.i(TAG, "path="+path+"; name="+name); paths[i]=name; } return paths; } else if(flag==1) { String[] ids=new String[albums.length]; for(int i=0; i<albums.length; i++) { // String id=albums[i].split("&")[0]; String id=albums[i].split("&")[1]; ids[i]=id; } return ids; } else return albums; } /* * 異步加載縮略圖到LoadedImage而後調用addImage方法更新Adapter */ class AsyncLoadedImage extends AsyncTask<Object, LoadedImage, Object> { @Override protected Object doInBackground(Object... params) { Bitmap bitmap; Bitmap newBitmap; for (int i = 0; i < paths.length; i++) { try { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 10; bitmap = BitmapFactory.decodeFile(paths[i], options); newBitmap = ThumbnailUtils.extractThumbnail(bitmap, 80, 80); bitmap.recycle(); if (newBitmap != null) { publishProgress(new LoadedImage(newBitmap)); } } catch (Exception e) { e.printStackTrace(); } } // } return null; } @Override public void onProgressUpdate(LoadedImage... value) { addImage(value); } @Override protected void onPostExecute(Object result) { setProgressBarIndeterminateVisibility(false); } } /* * Adapter */ class FileAdapter extends BaseAdapter { private Context mContext; private ArrayList<LoadedImage> photos = new ArrayList<LoadedImage>(); public void addPhoto(LoadedImage photo) { photos.add(photo); } public int getCount() { return photos.size(); } public FileAdapter(Context mContext) { this.mContext = mContext; } 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(8, 8, 8, 8); imageView.setImageBitmap(photos.get(position).getBitmap()); return imageView; } } /* * 這是個保存bitmap的類,加入Adapter的ArrayList中,隨着addImage更新Adapter */ private static class LoadedImage { Bitmap mBitmap; LoadedImage(Bitmap bitmap) { mBitmap = bitmap; } public Bitmap getBitmap() { return mBitmap; } } /* * 消息提示 */ 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(); } }