GridView异步加载本地图片以及全选/反选删除功能
2016-01-14 13:36
363 查看
有的时候我们需要读取SD卡或手机内存的图片显示到我们的项目,下面就介绍一下用GridView实现这一功能,并且具有全选/反选以及删除功能。
首先看一下效果图:
一、Activity代码
二、xml布局代码:
以上就是GridView加载图片,全选反选和删除的实现,Listview也可实现类似的功能,代码稍微变化即可。以上实现方法并不是最好的,望有更好实现方法的留言交流。
首先看一下效果图:
一、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也可实现类似的功能,代码稍微变化即可。以上实现方法并不是最好的,望有更好实现方法的留言交流。
相关文章推荐
- listview添加header
- 串口常用的隔离芯片
- Java微信公众号开发
- 选项菜单-OptionMenu
- float浮动
- ORACLE 删除一个用户的所有表
- 【问题解决】syntax error: unexpected end of file或-bash: ./full_build.sh: /bin/bash^M: bad interpreter: No
- PHP microtime 与.Net DateTime的ToFileTime相互转化
- 将低端进行到底
- spring配置dbcp链接数据库
- EMV规范 ---ISO7816 T=1协议的时间特性
- Html5绘制饼图统计图
- [springMVC - 1A] - Request processing failed; nested exception is org.apache.ibatis.builder.IncompleteElementException
- 转载: 黄聪:C#中 Excel列字母与数字的转换
- js中indexof()简单使用
- 阿里云Windows2012挂载云盘后操作
- DBCC SHOWCONTIG 用法
- 流程化与责任心
- fragement之间传递参数的问题
- 问题集锦