GridView异步加载本地图片以及全选/反选删除功能

来源:互联网 发布:jwt php类库 编辑:程序博客网 时间:2024/06/05 05:35

有的时候我们需要读取SD卡或手机内存的图片显示到我们的项目,下面就介绍一下用GridView实现这一功能,并且具有全选/反选以及删除功能。

首先看一下效果图:

 

一、Activity代码

import android.app.Activity;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;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.Handler;import android.os.Message;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.Window;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.FrameLayout;import android.widget.GridView;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.Toast;import java.io.File;import java.util.ArrayList;import java.util.List;public class SharePictureActivity extends Activity implements AdapterView.OnItemClickListener,View.OnClickListener,CompoundButton.OnCheckedChangeListener{    private LinearLayout share_picture_back;//返回    private TextView sharepic_remind_text;//没有图片提醒Text    private Button btn_selectpic,btn_delpic;//选择,删除按钮    private CheckBox delpic_allcheck;//全选/反选    private RelativeLayout sharepic_dellayout;    private ArrayList<LoadedImage> photos;    private GridView sdcardImages;    private FileAdapter fileAdapter;    private String[] imageName;    private boolean isSelect = true;//存储图片的路径    String path = "/mnt/sdcard/Pictures/photo/";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_share_picture);        init();        File file = new File(path);        if(!file.exists()){            file.mkdirs();        }//获取路径下的文件列表        imageName = file.list();        if(!(imageName != null && imageName.length>0)) {            sdcardImages.setVisibility(View.GONE);            sharepic_remind_text.setVisibility(View.VISIBLE);        }        setProgressBarIndeterminateVisibility(true);        new AsyncLoadedImage().execute();//加载图片    }    private void init(){        share_picture_back = (LinearLayout) findViewById(R.id.share_picture_back);        sharepic_remind_text = (TextView) findViewById(R.id.sharepic_remind_text);        btn_selectpic = (Button) findViewById(R.id.btn_selectpic);        btn_delpic = (Button) findViewById(R.id.btn_delpic);        delpic_allcheck = (CheckBox) findViewById(R.id.delpic_allcheck);        sharepic_dellayout = (RelativeLayout) findViewById(R.id.sharepic_dellayout);        sdcardImages = (GridView) findViewById(R.id.gridView);        sdcardImages.setOnItemClickListener(this);        fileAdapter = new FileAdapter(SharePictureActivity.this);        sdcardImages.setAdapter(fileAdapter);        share_picture_back.setOnClickListener(this);        btn_selectpic.setOnClickListener(this);        btn_delpic.setOnClickListener(this);        delpic_allcheck.setOnCheckedChangeListener(this);    }//全选/反选监听    @Override    public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {        if(isChecked){            delpic_allcheck.setText(getResources().getString(R.string.cancle_all));            for(int i=0;i < fileAdapter.photos.size() ; i++){                fileAdapter.photos.get(i).setFlag(true);            }        }else{            delpic_allcheck.setText(getResources().getString(R.string.all));            for(int i=0;i < fileAdapter.photos.size() ; i++){                fileAdapter.photos.get(i).setFlag(false);            }        }        fileAdapter.notifyDataSetChanged();    }    @Override    public void onClick(View view) {        switch (view.getId()){            case R.id.share_picture_back:                finish();                break;            case R.id.btn_selectpic:                if(isSelect){                    btn_selectpic.setText(getResources().getString(R.string.cancle));                    sharepic_dellayout.setVisibility(View.VISIBLE);                    isSelect = false;                    fileAdapter.setDelPosition(1);                    fileAdapter.notifyDataSetChanged();                }else{                    btn_selectpic.setText(getResources().getString(R.string.select));                    sharepic_dellayout.setVisibility(View.GONE);                    isSelect = true;                    fileAdapter.setDelPosition(0);                    fileAdapter.notifyDataSetChanged();                }                break;            case R.id.btn_delpic:                boolean isSelected = false;                for(int i=0 ; i < fileAdapter.photos.size() ; i++){                    if(fileAdapter.photos.get(i).getFlag() == true){                        isSelected = true;                        break;                    }                }                if(isSelected){                    Message message = new Message();message.what = 0;delHandler.sendMessage(message);                }else{                    Toast.makeText(SharePictureActivity.this, "请先选择要删除的图片",Toast.LENGTH_SHORT).show();                }                break;            default:                break;        }    }    final Handler delHandler = new Handler(){        @Override        public void handleMessage(Message msg) {            if(msg.what == 0) {                List<LoadedImage> deleteList = new ArrayList<LoadedImage>();                File file = null;//删除选中的文件                for(int i=0 ; i< fileAdapter.photos.size() ; i++){                    if(fileAdapter.photos.get(i).getFlag()){                        deleteList.add(fileAdapter.photos.get(i));                        file = new File(fileAdapter.photos.get(i).getPicPath());                        file.delete();                    }                }                fileAdapter.photos.removeAll(deleteList);                deleteList.clear();                fileAdapter.notifyDataSetChanged();                //如果全部删除则隐藏GridView,显示提示去保存图片文字                if(fileAdapter.photos.size() == 0){                    sdcardImages.setVisibility(View.GONE);                    sharepic_remind_text.setVisibility(View.VISIBLE);                }                Toast.makeText(SharePictureActivity.this, "删除成功",Toast.LENGTH_SHORT).show();            }        }    };    /*     * 释放Bitmap内存     */    @Override    protected void onDestroy() {        super.onDestroy();        final GridView grid = sdcardImages;        final int count = grid.getChildCount();        ImageView imageView = null;        View view = null;        for(int i = 0;i < count;i++){            view = grid.getChildAt(i);            imageView = (ImageView) view.findViewById(R.id.img_share);            ((BitmapDrawable)imageView.getDrawable()).setCallback(null);        }        System.gc();    }    /*     * 刷新Adapter     */    private void addImage(LoadedImage... value){        for(LoadedImage image:value){            fileAdapter.addPhoto(image);            fileAdapter.notifyDataSetChanged();        }    }    /*     * 异步加载缩略图到LoadedImage然后调用addImage方法更新Adapter     */    class AsyncLoadedImage extends AsyncTask<Object, LoadedImage, Object> {        @Override        protected Object doInBackground(Object... objects) {            String path = "/mnt/sdcard/Pictures/photo/";            File file = new File(path);            if(!file.exists()){                file.mkdirs();            }else{                File[] files = file.listFiles();                String[] paths = new String[files.length];                Bitmap bitmap;                Bitmap newBiemap;                for(int i = files.length -1 ;i >= 0; i--){                    paths[i] = files[i].getPath();                    try{                        BitmapFactory.Options options = new BitmapFactory.Options();                        options.inSampleSize = 10;                        bitmap = BitmapFactory.decodeFile(paths[i],options);                        newBiemap = ThumbnailUtils.extractThumbnail(bitmap, 255, 255);                        bitmap.recycle();                        if(newBiemap != null){                            publishProgress(new LoadedImage(newBiemap,paths[i],false));                        }                    }catch (Exception e){                        e.printStackTrace();                    }                }            }            return null;        }        /*         *实时更新UI  onProgressUpdate()方法的参数对应于doInBackground中publishProgress方法的参数,同时也对应于         *doInBackground的第二个参数         */        @Override        protected void onProgressUpdate(LoadedImage... values) {            addImage(values);        }        @Override        protected void onPostExecute(Object result) {            setProgressBarIndeterminateVisibility(false);        }    }    class FileAdapter extends BaseAdapter {        private Context mContext;        LayoutInflater inflater;        private static final int EDIT_STATUS = 1;        private static final int UNEDIT_STATUS = 0;        private int delPosition = UNEDIT_STATUS;        private ArrayList<LoadedImage> photos = new ArrayList<LoadedImage>();        public FileAdapter(Context context){            mContext = context;            inflater = LayoutInflater.from(mContext);        }        public void addPhoto(LoadedImage photo){            photos.add(photo);        }        public void setDelPosition(int delePosition){            this.delPosition = delePosition;        }        @Override        public int getCount() {            return photos.size();        }        @Override        public Object getItem(int position) {            return photos.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            final int pos = position;            ViewHolder viewHolder = null;            if(convertView == null){                viewHolder = new ViewHolder();                convertView = inflater.inflate(R.layout.share_photo_item, null);                viewHolder.img_share = (ImageView) convertView.findViewById(R.id.img_share);                viewHolder.pic_check = (CheckBox) convertView.findViewById(R.id.pic_check);                convertView.setTag(viewHolder);            }else{                viewHolder = (ViewHolder) convertView.getTag();            }            viewHolder.img_share.setPadding(0, 1, 1, 1);            viewHolder.img_share.setImageBitmap(photos.get(position).getBitmap());            if(delPosition == UNEDIT_STATUS){                viewHolder.pic_check.setVisibility(View.GONE);            }else{                viewHolder.pic_check.setVisibility(View.VISIBLE);            }            viewHolder.pic_check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {                @Override                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                    if (isChecked) {                        photos.get(pos).setFlag(true);                    } else {                        photos.get(pos).setFlag(false);                    }                }            });            viewHolder.pic_check.setChecked(photos.get(position).getFlag());            return convertView;        }        final class ViewHolder {            public ImageView img_share;            public CheckBox pic_check;        }    }    private static class LoadedImage{        String picPath;        Bitmap mBitmap;        boolean flag;        LoadedImage(Bitmap bitmap,String picPath,boolean flag){            this.mBitmap = bitmap;            this.picPath = picPath;            this.flag = flag;        }        public Bitmap getBitmap(){            return mBitmap;        }        public String getPicPath(){            return picPath;        }        public boolean getFlag(){            return flag;        }        public void setFlag(boolean flag){            this.flag = flag;        }    }}
二、xml布局代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/sharepic_relayout"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#232628"    tools:context="com.kcl.dfss.SharePictureActivity">    <RelativeLayout        android:id="@+id/sharepic_title"        android:layout_width="match_parent"        android:layout_height="50dp"        android:background="@drawable/title_background" >        <TextView            android:id="@+id/textView1"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerHorizontal="true"            android:layout_centerVertical="true"            android:text="相册"            android:textSize="22sp"            android:textColor="#c8dadf" />        <LinearLayout            android:id="@+id/share_picture_back"            android:layout_width="wrap_content"            android:layout_height="match_parent"            android:orientation="horizontal">            <ImageView                android:id="@+id/imageView1"                android:layout_width="20dp"                android:layout_height="20dp"                android:layout_gravity="center_vertical"                android:layout_marginLeft="10dp"                android:src="@drawable/back_arrow" />            <TextView                android:id="@+id/textView2"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_gravity="center_vertical"                android:layout_marginLeft="5dp"                android:text="返回"                android:textSize="18sp"                android:textColor="#c8dadf" />        </LinearLayout>        <Button            android:id="@+id/btn_selectpic"            android:layout_width="60dp"            android:layout_height="match_parent"            android:layout_alignParentRight="true"            android:layout_alignParentTop="true"            android:layout_marginLeft="10dp"            android:text="选择"            android:background="@null"            android:textColor="#c8dadf"            android:textSize="18sp" />    </RelativeLayout>    <GridView        android:id="@+id/gridView"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_below="@+id/sharepic_title"        android:numColumns="4"        android:stretchMode="columnWidth"        android:verticalSpacing="2dp"        android:horizontalSpacing="2dp"        android:visibility="visible"/>    <TextView        android:id="@+id/sharepic_remind_text"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@id/sharepic_title"        android:layout_marginTop="50dp"        android:textSize="18sp"        android:textColor="#c8dadf"        android:layout_centerHorizontal="true"        android:visibility="gone"        android:text="请先保存图片"/>    <RelativeLayout        android:id="@+id/sharepic_dellayout"        android:layout_width="match_parent"        android:layout_height="60dp"        android:layout_alignParentBottom="true"        android:background="#272b2e"        android:visibility="gone" >        <ImageView            android:id="@+id/imageView2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerHorizontal="true"            android:layout_centerVertical="true"            android:layout_marginTop="5dp"            android:layout_marginBottom="5dp"            android:src="@drawable/divide_line" />        <CheckBox            android:id="@+id/delpic_allcheck"            android:layout_width="wrap_content"            android:layout_height="match_parent"            android:layout_alignParentLeft="true"            android:layout_centerVertical="true"            android:layout_marginLeft="15dp"            android:layout_weight="1"            android:button="@drawable/check_state"            android:paddingLeft="20dp"            android:text="@string/all"            android:textColor="#c8dadf"            android:textSize="18sp" />        <Button            android:id="@+id/btn_delpic"            android:layout_width="100dp"            android:layout_height="match_parent"            android:layout_alignBaseline="@+id/allcheck"            android:layout_alignBottom="@+id/allcheck"            android:layout_alignParentRight="true"            android:layout_marginRight="48dp"            android:layout_weight="1"            android:background="@null"            android:text="删除"            android:textColor="#c8dadf"            android:textSize="18sp" />    </RelativeLayout></RelativeLayout>
以上就是GridView加载图片,全选反选和删除的实现,Listview也可实现类似的功能,代码稍微变化即可。以上实现方法并不是最好的,望有更好实现方法的留言交流。


2 1