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

有的时候我们需要读取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也可实现类似的功能,代码稍微变化即可。以上实现方法并不是最好的,望有更好实现方法的留言交流。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值