您的位置:首页 > 其它

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

2016-01-14 13:36 363 查看
有的时候我们需要读取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也可实现类似的功能,代码稍微变化即可。以上实现方法并不是最好的,望有更好实现方法的留言交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: