图片选择器(单选、多选、自定义张数)

相信做Android的朋友们,都会用到图片选择器;我会在也用过github上面的几款星星数较高的图片选择器,功能确实很强大。在Android Studio 使用也很方便。在此列出了方便大家使用;1、图片选择器:https://github.com/LuckSiege/PictureSelector;2、图片选择器: http://www.jianshu.com/p/e78b3fe9dcb6 。为什么我还是用自己的图片选择器呢?主要是遇到问题好针对解决。Android系统被更改、配置不一、版本不一,导致问题总会有。写这篇博客为了让大家有个选择,同时也记录下来,方便日后使用。

1、不多说上目录:

上图可以看到,大部分都是通用部分,也包括多选SelectPhotoAdapter、以及 gridView_select_photo_item;那么就是mainActivity使用部分,就可以快捷使用图片选择器。当然你需要在清单文件加权限、以及注册下MultiImageSelectorActivity;

2、首先介绍下图片选择气的主要实现功能部分MultiImageSelectorFragment:

package com.imageselectdome.library.multiimageselector;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v7.widget.ListPopupWindow;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.GridView;
import android.widget.TextView;
import android.widget.Toast;

import com.imageselectdome.R;
import com.imageselectdome.library.multiimageselector.adapter.FolderAdapter;
import com.imageselectdome.library.multiimageselector.adapter.ImageGridAdapter;
import com.imageselectdome.library.multiimageselector.bean.Folder;
import com.imageselectdome.library.multiimageselector.bean.Image;
import com.imageselectdome.library.multiimageselector.utils.FileUtils;
import com.imageselectdome.library.multiimageselector.utils.TimeUtils;
import com.squareup.picasso.Picasso;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 图片选择Fragment Created by Nereo on 2015/4/7.
 */
public class MultiImageSelectorFragment extends Fragment {

	private static final String TAG = "MultiImageSelector";

	/** 最大图片选择次数,int类型 */
	public static final String EXTRA_SELECT_COUNT = "max_select_count";
	/** 图片选择模式,int类型 */
	public static final String EXTRA_SELECT_MODE = "select_count_mode";
	/** 是否显示相机,boolean类型 */
	public static final String EXTRA_SHOW_CAMERA = "show_camera";
	/** 默认选择的数据集 */
	public static final String EXTRA_DEFAULT_SELECTED_LIST = "default_result";
	/** 单选 */
	public static final int MODE_SINGLE = 0;
	/** 多选 */
	public static final int MODE_MULTI = 1;
	// 不同loader定义
	private static final int LOADER_ALL = 0;
	private static final int LOADER_CATEGORY = 1;
	// 请求加载系统照相机
	private static final int REQUEST_CAMERA = 100;

	// 结果数据
	private ArrayList<String> resultList = new ArrayList<String>();
	// 文件夹数据
	private ArrayList<Folder> mResultFolder = new ArrayList<Folder>();

	// 图片Grid
	private GridView mGridView;
	private Callback mCallback;

	private ImageGridAdapter mImageAdapter;
	private FolderAdapter mFolderAdapter;

	private ListPopupWindow mFolderPopupWindow;

	// 时间线
	private TextView mTimeLineText;
	// 类别
	private TextView mCategoryText;
	// 预览按钮
	private Button mPreviewBtn;
	// 底部View
	private View mPopupAnchorView;

	private int mDesireImageCount;

	private boolean hasFolderGened = false;
	private boolean mIsShowCamera = false;

	private int mGridWidth, mGridHeight;

	private File mTmpFile;

	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		try {
			mCallback = (Callback) activity;
		} catch (ClassCastException e) {
			throw new ClassCastException(
					"The Activity must implement MultiImageSelectorFragment.Callback interface...");
		}
	}

	@Override
	public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
			@Nullable Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_multi_image, container, false);
	}

	@Override
	public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
		super.onViewCreated(view, savedInstanceState);

		// 选择图片数量
		mDesireImageCount = getArguments().getInt(EXTRA_SELECT_COUNT);

		// 图片选择模式
		final int mode = getArguments().getInt(EXTRA_SELECT_MODE);

		// 默认选择
		if (mode == MODE_MULTI) {
			ArrayList<String> tmp = getArguments().getStringArrayList(EXTRA_DEFAULT_SELECTED_LIST);
			if (tmp != null && tmp.size() > 0) {
				resultList = tmp;
			}
		}

		// 是否显示照相机
		mIsShowCamera = getArguments().getBoolean(EXTRA_SHOW_CAMERA, true);
		mImageAdapter = new ImageGridAdapter(getActivity(), mIsShowCamera);
		// 是否显示选择指示器
		mImageAdapter.showSelectIndicator(mode == MODE_MULTI);

		mPopupAnchorView = view.findViewById(R.id.footer);

		mTimeLineText = (TextView) view.findViewById(R.id.timeline_area);
		// 初始化,先隐藏当前timeline
		mTimeLineText.setVisibility(View.GONE);

		mCategoryText = (TextView) view.findViewById(R.id.category_btn);
		// 初始化,加载所有图片
		mCategoryText.setText(R.string.folder_all);
		mCategoryText.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				if (mFolderPopupWindow == null) {
					createPopupFolderList(mGridWidth, mGridHeight);
				}

				if (mFolderPopupWindow.isShowing()) {
					mFolderPopupWindow.dismiss();
				} else {
					mFolderPopupWindow.show();
					int index = mFolderAdapter.getSelectIndex();
					index = index == 0 ? index : index - 1;
					mFolderPopupWindow.getListView().setSelection(index);
				}
			}
		});

		mPreviewBtn = (Button) view.findViewById(R.id.preview);
		// 初始化,按钮状态初始化
		if (resultList == null || resultList.size() <= 0) {
			mPreviewBtn.setText(R.string.preview);
			mPreviewBtn.setEnabled(false);
		}
		mPreviewBtn.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				// TODO 预览
			}
		});

		mGridView = (GridView) view.findViewById(R.id.grid);
		mGridView.setOnScrollListener(new AbsListView.OnScrollListener() {
			@Override
			public void onScrollStateChanged(AbsListView absListView, int state) {

				final Picasso picasso = Picasso.with(getActivity());
				if (state == SCROLL_STATE_IDLE || state == SCROLL_STATE_TOUCH_SCROLL) {
					picasso.resumeTag(getActivity());
				} else {
					picasso.pauseTag(getActivity());
				}

				if (state == SCROLL_STATE_IDLE) {
					// 停止滑动,日期指示器消失
					mTimeLineText.setVisibility(View.GONE);
				} else if (state == SCROLL_STATE_FLING) {
					mTimeLineText.setVisibility(View.VISIBLE);
				}
			}

			@Override
			public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
				if (mTimeLineText.getVisibility() == View.VISIBLE) {
					int index = firstVisibleItem + 1 == view.getAdapter().getCount() ? view.getAdapter().getCount() - 1
							: firstVisibleItem + 1;
					Image image = (Image) view.getAdapter().getItem(index);
					if (image != null) {
						mTimeLineText.setText(TimeUtils.formatPhotoDate(image.path));
					}
				}
			}
		});
		mGridView.setAdapter(mImageAdapter);
		mGridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
			@Override
			@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
			public void onGlobalLayout() {

				final int width = mGridView.getWidth();
				final int height = mGridView.getHeight();

				mGridWidth = width;
				mGridHeight = height;

				final int desireSize = getResources().getDimensionPixelOffset(R.dimen.image_size);
				final int numCount = width / desireSize;
				final int columnSpace = getResources().getDimensionPixelOffset(R.dimen.space_size);
				int columnWidth = (width - columnSpace * (numCount - 1)) / numCount;
				mImageAdapter.setItemSize(columnWidth);

				if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
					mGridView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
				} else {
					mGridView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
				}
			}
		});
		mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
				if (mImageAdapter.isShowCamera()) {
					// 如果显示照相机,则第一个Grid显示为照相机,处理特殊逻辑
					if (i == 0) {
						showCameraAction();
					} else {
						// 正常操作
						Image image = (Image) adapterView.getAdapter().getItem(i);
						selectImageFromGrid(image, mode);
					}
				} else {
					// 正常操作
					Image image = (Image) adapterView.getAdapter().getItem(i);
					selectImageFromGrid(image, mode);
				}
			}
		});

		mFolderAdapter = new FolderAdapter(getActivity());
	}

	/**
	 * 创建弹出的ListView
	 */
	private void createPopupFolderList(int width, int height) {
		mFolderPopupWindow = new ListPopupWindow(getActivity());
		mFolderPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
		mFolderPopupWindow.setAdapter(mFolderAdapter);
		mFolderPopupWindow.setContentWidth(width);
		mFolderPopupWindow.setWidth(width);
		mFolderPopupWindow.setHeight(height * 5 / 8);
		mFolderPopupWindow.setAnchorView(mPopupAnchorView);
		mFolderPopupWindow.setModal(true);
		mFolderPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

				mFolderAdapter.setSelectIndex(i);

				final int index = i;
				final AdapterView v = adapterView;

				new Handler().postDelayed(new Runnable() {
					@Override
					public void run() {
						mFolderPopupWindow.dismiss();

						if (index == 0) {
							getActivity().getSupportLoaderManager().restartLoader(LOADER_ALL, null, mLoaderCallback);
							mCategoryText.setText(R.string.folder_all);
							if (mIsShowCamera) {
								mImageAdapter.setShowCamera(true);
							} else {
								mImageAdapter.setShowCamera(false);
							}
						} else {
							Folder folder = (Folder) v.getAdapter().getItem(index);
							if (null != folder) {
								mImageAdapter.setData(folder.images);
								mCategoryText.setText(folder.name);
								// 设定默认选择
								if (resultList != null && resultList.size() > 0) {
									mImageAdapter.setDefaultSelected(resultList);
								}
							}
							mImageAdapter.setShowCamera(false);
						}

						// 滑动到最初始位置
						mGridView.smoothScrollToPosition(0);
					}
				}, 100);

			}
		});
	}

	@Override
	public void onActivityCreated(@Nullable Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		// 首次加载所有图片
		// new LoadImageTask().execute();
		getActivity().getSupportLoaderManager().initLoader(LOADER_ALL, null, mLoaderCallback);
	}

	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		// 相机拍照完成后,返回图片路径
		if (requestCode == REQUEST_CAMERA) {
			if (resultCode == Activity.RESULT_OK) {
				if (mTmpFile != null) {
					if (mCallback != null) {
						mCallback.onCameraShot(mTmpFile);
					}
				}
			} else {
				if (mTmpFile != null && mTmpFile.exists()) {
					mTmpFile.delete();
				}
			}
		}
	}

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		Log.d(TAG, "on change");

		if (mFolderPopupWindow != null) {
			if (mFolderPopupWindow.isShowing()) {
				mFolderPopupWindow.dismiss();
			}
		}

		mGridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
			@Override
			@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
			public void onGlobalLayout() {

				final int height = mGridView.getHeight();

				final int desireSize = getResources().getDimensionPixelOffset(R.dimen.image_size);
				Log.d(TAG, "Desire Size = " + desireSize);
				final int numCount = mGridView.getWidth() / desireSize;
				Log.d(TAG, "Grid Size = " + mGridView.getWidth());
				Log.d(TAG, "num count = " + numCount);
				final int columnSpace = getResources().getDimensionPixelOffset(R.dimen.space_size);
				int columnWidth = (mGridView.getWidth() - columnSpace * (numCount - 1)) / numCount;
				mImageAdapter.setItemSize(columnWidth);

				if (mFolderPopupWindow != null) {
					mFolderPopupWindow.setHeight(height * 5 / 8);
				}

				if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
					mGridView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
				} else {
					mGridView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
				}
			}
		});

		super.onConfigurationChanged(newConfig);

	}

	/**
	 * 选择相机
	 */
	private void showCameraAction() {

		// 判断选择数量问题
		if (mDesireImageCount == resultList.size()) {
			Toast.makeText(getActivity(), R.string.msg_amount_limit, Toast.LENGTH_SHORT).show();
			return;
		}

		// 跳转到系统照相机
		try {
			Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
			if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
				// 设置系统相机拍照后的输出路径
				// 创建临时文件
				mTmpFile = FileUtils.createTmpFile(getActivity());
				cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));
				startActivityForResult(cameraIntent, REQUEST_CAMERA);
			} else {
				Toast.makeText(getActivity(), R.string.msg_no_camera, Toast.LENGTH_SHORT).show();
			}
		} catch (Exception e) {
			Toast.makeText(getActivity(),"拍照权限被禁用,请进入系统设置打开权限",Toast.LENGTH_SHORT).show();
			ActivityCompat.requestPermissions(getActivity(), new String[]{android.Manifest.permission.CAMERA}, 123);
			e.printStackTrace();
		}
	}

	/**
	 * 选择图片操作
	 * 
	 * @param image
	 */
	private void selectImageFromGrid(Image image, int mode) {
		if (image != null) {
			// 多选模式
			if (mode == MODE_MULTI) {
				if (resultList.contains(image.path)) {
					resultList.remove(image.path);
					if (resultList.size() != 0) {
						mPreviewBtn.setEnabled(true);
						mPreviewBtn.setText(getResources().getString(R.string.preview) + "(" + resultList.size() + ")");
					} else {
						mPreviewBtn.setEnabled(false);
						mPreviewBtn.setText(R.string.preview);
					}
					if (mCallback != null) {
						mCallback.onImageUnselected(image.path);
					}
				} else {
					// 判断选择数量问题
					if (mDesireImageCount == resultList.size()) {
						Toast.makeText(getActivity(), R.string.msg_amount_limit, Toast.LENGTH_SHORT).show();
						return;
					}

					resultList.add(image.path);
					mPreviewBtn.setEnabled(true);
					mPreviewBtn.setText(getResources().getString(R.string.preview) + "(" + resultList.size() + ")");
					if (mCallback != null) {
						mCallback.onImageSelected(image.path);
					}
				}
				mImageAdapter.select(image);
			} else if (mode == MODE_SINGLE) {
				// 单选模式
				if (mCallback != null) {
					mCallback.onSingleImageSelected(image.path);
				}
			}
		}
	}

	private LoaderManager.LoaderCallbacks<Cursor> mLoaderCallback = new LoaderManager.LoaderCallbacks<Cursor>() {

		private final String[] IMAGE_PROJECTION = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.DISPLAY_NAME,
				MediaStore.Images.Media.DATE_ADDED, MediaStore.Images.Media._ID };

		@Override
		public Loader<Cursor> onCreateLoader(int id, Bundle args) {
			if (id == LOADER_ALL) {
				CursorLoader cursorLoader = new CursorLoader(getActivity(),
						MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION, null, null,
						IMAGE_PROJECTION[2] + " DESC");
				return cursorLoader;
			} else if (id == LOADER_CATEGORY) {
				CursorLoader cursorLoader = new CursorLoader(getActivity(),
						MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION,
						IMAGE_PROJECTION[0] + " like '%" + args.getString("path") + "%'", null,
						IMAGE_PROJECTION[2] + " DESC");
				return cursorLoader;
			}

			return null;
		}

		@Override
		public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
			if (data != null) {
				List<Image> images = new ArrayList<Image>();
				int count = data.getCount();
				if (count > 0) {
					data.moveToFirst();
					do {
						String path = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[0]));
						String name = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[1]));
						long dateTime = data.getLong(data.getColumnIndexOrThrow(IMAGE_PROJECTION[2]));
						Image image = new Image(path, name, dateTime);
						images.add(image);
						if (!hasFolderGened) {
							// 获取文件夹名称
							File imageFile = new File(path);
							File folderFile = imageFile.getParentFile();
							Folder folder = new Folder();
							folder.name = folderFile.getName();
							folder.path = folderFile.getAbsolutePath();
							folder.cover = image;
							if (!mResultFolder.contains(folder)) {
								List<Image> imageList = new ArrayList<Image>();
								imageList.add(image);
								folder.images = imageList;
								mResultFolder.add(folder);
							} else {
								// 更新
								Folder f = mResultFolder.get(mResultFolder.indexOf(folder));
								f.images.add(image);
							}
						}

					} while (data.moveToNext());

					mImageAdapter.setData(images);

					// 设定默认选择
					if (resultList != null && resultList.size() > 0) {
						mImageAdapter.setDefaultSelected(resultList);
					}

					mFolderAdapter.setData(mResultFolder);
					hasFolderGened = true;

				}
			}
		}

		@Override
		public void onLoaderReset(Loader<Cursor> loader) {

		}
	};

	/**
	 * 回调接口
	 */
	public interface Callback {
		void onSingleImageSelected(String path);

		void onImageSelected(String path);

		void onImageUnselected(String path);

		void onCameraShot(File imageFile);
	}
}

可以看到,我们可以选择图片、拍照,在拍照处理了没有权限问题;

3、说下主要实现单选、多选部分。首先是主界面使用部分MainActivity,为了不使用我框架里面东西,就没继承BaseActivity:

package com.imageselectdome;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.GridView;
import android.widget.ImageView;
import com.imageselectdome.library.multiimageselector.MultiImageSelectorActivity;
import com.squareup.picasso.Picasso;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import static com.imageselectdome.SelectPhotoAdapter.dp2px;

/**
 * 图片选择器(多张、单张)
 */
public class MainActivity extends AppCompatActivity {
    private Context mContext=MainActivity.this;
    private static final int REQUEST_BIG_IMAGE = 1;//多张请求码
    private static final int REQUEST_SINGLE_IMAGE = 2;//单张请求码
    GridView mGridViewShow;// 多张图片显示
    SelectPhotoAdapter mAdapter;//多张图片Adapter
    List<File> files = new ArrayList<>();//用于表单上传(此没有用到)
    List<String> beans = new ArrayList<>();//图片路径
    ImageView mImgAdd;//单选


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
        initDatas();
        initEvent();
    }

    private void initViews() {
        mGridViewShow = (GridView) findViewById(R.id.gridView_show);
        mImgAdd = (ImageView) findViewById(R.id.img_add);
    }

    /**
     * 初始化多张图片选择器
     */
    private void initDatas() {
        mAdapter = new SelectPhotoAdapter(this, beans);
        mGridViewShow.setAdapter(mAdapter);
        mAdapter.setRequestCodeAndMaxNum(REQUEST_BIG_IMAGE, 5);//5代表最多张数(建议在9张一下)
    }

    private void initEvent() {
        mImgAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    Intent intent = new Intent();
                    intent.setClass(MainActivity.this, MultiImageSelectorActivity.class);
                    // 是否显示拍摄图片
                    intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, true);
                    // 选择模式
                    intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, MultiImageSelectorActivity.MODE_SINGLE);
                    // 最大可选择图片数量
                    intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, 1);
                    startActivityForResult(intent, REQUEST_SINGLE_IMAGE);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            if (requestCode == REQUEST_BIG_IMAGE) {//多张
                List<String> photoPath = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
                if (photoPath != null && photoPath.size() > 0) {
                    beans.clear();
                    beans.addAll(photoPath);
                    mAdapter.notifyDataSetChanged();
                    for (int i = 0; i < beans.size(); i++) {//转为file类型,可用于表单上传
                        File file = PictureUtils.scal(beans.get(i));
                        files.add(file);
                    }
                }
            } else if (requestCode == REQUEST_SINGLE_IMAGE) {//单张
                List<String> photoPaths = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
                if (photoPaths != null && photoPaths.size() > 0) {
                    Log.e("xuxu", photoPaths.get(0));
                    Picasso.with(mContext).load(new File(photoPaths.get(0))).placeholder(R.drawable.default_error)
                            .config(Bitmap.Config.RGB_565).resize(dp2px(mContext, 100), dp2px(mContext, 75))
                            .centerCrop().into(mImgAdd);
                }
            }
        }
    }

}
3、多选用到了自定义的Adapter,为了不牵出其他东西,就没用万能适配器。还是决定使用BaseAdapter:

package com.imageselectdome;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.imageselectdome.library.multiimageselector.MultiImageSelectorActivity;
import com.squareup.picasso.Picasso;

import java.io.File;
import java.util.ArrayList;
import java.util.List;


public class SelectPhotoAdapter extends BaseAdapter {
    private LayoutInflater mInflater;//得到一个LayoutInfalter对象用来导入布局
    DisplayMetrics mDis;
    List<String> datas = new ArrayList<>();
    Context mContext;

    public SelectPhotoAdapter(Context context, List<String> datas) {
        mDis = context.getResources().getDisplayMetrics();
        this.mContext = context;
        this.datas = datas;
        this.mInflater = LayoutInflater.from(context);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.gridview_select_photo_item, null);
            holder = new ViewHolder();
            holder.tv_delete = (TextView) convertView.findViewById(R.id.id_delete);
            holder.imageView = (ImageView) convertView.findViewById(R.id.id_image_scale);
            holder.tv_topView = (TextView) convertView.findViewById(R.id.id_text01);
            convertView.setTag(holder);//绑定ViewHolder对象
        } else {
            holder = (ViewHolder) convertView.getTag();//取出ViewHolder对象
        }
        if (datas.size() == position && datas.size() != mMaxNum) { // 是最后一项且不是最大的一项
            holder.tv_delete.setVisibility(View.INVISIBLE);
            holder.tv_topView.setVisibility(View.INVISIBLE);
            Picasso.with(mContext).load(R.drawable.tianjia).placeholder(R.drawable.tianjia)
                    .config(Bitmap.Config.RGB_565).resize(dp2px(mContext, 100), dp2px(mContext, 75))
                    .centerCrop().into(holder.imageView);
        } else {
            holder.tv_delete.setVisibility(View.VISIBLE);
            holder.tv_topView.setVisibility(View.VISIBLE);
            Picasso.with(mContext).load(new File(datas.get(position))).placeholder(R.drawable.default_error)
                    .config(Bitmap.Config.RGB_565).resize(dp2px(mContext, 100), dp2px(mContext, 75))
                    .centerCrop().into(holder.imageView);
        }

        holder.tv_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                datas.remove(position);
                notifyDataSetChanged();
            }
        });

        holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(mContext, MultiImageSelectorActivity.class);
                // 是否显示拍摄图片
                intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, true);
                // 选择模式
                intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, MultiImageSelectorActivity.MODE_MULTI);
                // 最大可选择图片数量
                intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, mMaxNum);
                // 默认选择
                if (datas != null && datas.size() > 0) {
                    intent.putExtra(MultiImageSelectorActivity.EXTRA_DEFAULT_SELECTED_LIST, (ArrayList<String>) datas);
                }
                ((Activity) mContext).startActivityForResult(intent, mRequestCode);
            }
        });
        return convertView;
    }

    /**
     * 存放控件
     */
    public final class ViewHolder {
        public TextView tv_topView;
        public TextView tv_delete;
        public ImageView imageView;
    }

    /**
     * dp转px
     *
     * @param context 上下文
     * @param dpValue dp值
     * @return px值
     */
    public static int dp2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }


    private void changeSize(View convertView) {
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) convertView.getLayoutParams();
        params.width = (int) ((mDis.widthPixels - (82 * mDis.density)) / 3);
        params.height = (int) (params.width * 0.75);
    }

    @Override
    public int getCount() {
        int count = datas.size(); // 真正的数量
        if (count < mMaxNum) {
            count = count + 1;
        }
        return count;
    }

    @Override
    public String getItem(int position) {
        if (datas.size() == position && datas.size() != mMaxNum) {
            return "";
        }
        return getItem(position);
    }

    private int mRequestCode = 0;
    private int mMaxNum = 9;

    /**
     * 设置请求码,以便在activity中接收默认为0 和最大的图片选择数量默认为9
     *
     * @param requestCode
     */
    public void setRequestCodeAndMaxNum(int requestCode, int maxNum) {
        mRequestCode = requestCode;
        mMaxNum = maxNum;
    }

}
看主界面,在使用多选Adapter时,我们在一进来时就初始化,同时我们在Adapter处理了,当选择没选择就显示一直默认图、点击选择一张或者多种,当小于最大张数就会在最后显示加号供添加,当等于是就不显示;

4、话不多说上效果图:

多选界面:


主界面图:


Dome链接看下面http://download.csdn.net/detail/yanxuxu123/9762037


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值