图片选择器(单选、多选、自定义张数)
来源:互联网 发布:数据结构排序算法心得 编辑:程序博客网 时间:2024/05/07 15:41
相信做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>();// 图片Gridprivate GridView mGridView;private Callback mCallback;private ImageGridAdapter mImageAdapter;private FolderAdapter mFolderAdapter;private ListPopupWindow mFolderPopupWindow;// 时间线private TextView mTimeLineText;// 类别private TextView mCategoryText;// 预览按钮private Button mPreviewBtn;// 底部Viewprivate View mPopupAnchorView;private int mDesireImageCount;private boolean hasFolderGened = false;private boolean mIsShowCamera = false;private int mGridWidth, mGridHeight;private File mTmpFile;@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);try {mCallback = (Callback) activity;} catch (ClassCastException e) {throw new ClassCastException("The Activity must implement MultiImageSelectorFragment.Callback interface...");}}@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_multi_image, container, false);}@Overridepublic 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);// 初始化,先隐藏当前timelinemTimeLineText.setVisibility(View.GONE);mCategoryText = (TextView) view.findViewById(R.id.category_btn);// 初始化,加载所有图片mCategoryText.setText(R.string.folder_all);mCategoryText.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic void onClick(View view) {// TODO 预览}});mGridView = (GridView) view.findViewById(R.id.grid);mGridView.setOnScrollListener(new AbsListView.OnScrollListener() {@Overridepublic 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);}}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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);}});}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);// 首次加载所有图片// new LoadImageTask().execute();getActivity().getSupportLoaderManager().initLoader(LOADER_ALL, null, mLoaderCallback);}@Overridepublic 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();}}}}@Overridepublic 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 };@Overridepublic 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;}@Overridepublic 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;}}}@Overridepublic 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 0
- 图片选择器(单选、多选、自定义张数)
- PhotoPicker图片选择器,支持单选,多选
- iOS:图片选择器(单选、多选、支持arc、支持iOS7+)
- 【图片选择】Android 仿微信图片选择器疾风加载 (单选,多选,相机)--唯剑做伴且随疾风前行
- Android自定义图片选择器
- tabletableView的单选(系统对勾) 自定义的单选(自定义图片)
- Andriod图片选择器(单选-头像,多选-朋友圈上传):library+sample
- 自定义选择器(同时支持单滚轮和双滚轮联动选择器)
- ListView 中显示自定义单选列表,实现单选效果(左文字,右图片)
- 选择想要出现的图片张数
- iOS 自定义多张图片选择+demo
- 焦点图片(自动播放 不限图片张数 可左右控制)
- android多图选择器 图片/视频 单选or多选,以及视频录制。The is Android Image Selector。
- ajaxFileUpload结合图片预览(可控制上传的张数)
- js-动态生成小圆点(根据轮播图图片张数动态生成小圆点)
- 多选 单选 自定义菜单
- 自定义Dialog(图片,文字说明,单选按钮)----类ListPreference实现(2)
- 自定义Dialog(图片,文字说明,单选按钮)----类ListPreference实现(2)
- CDH5.7.2部署流程
- x264代码详解——主函数main()
- 【C++】学习笔记三十——函数参数和按值传递
- [51NOD1239]欧拉函数之和
- 1、CSDN markdown 字体、字号、颜色设置(自己用的)
- 图片选择器(单选、多选、自定义张数)
- UI一般规则
- PAT 乙级 1043. 输出PATest(20) Java版
- 菜单栏用定位的方式来确定子菜单的位置,根据长度来计算居左还是居右
- ubuntu 16.04配置jdk环境
- 牛顿迭代法
- RecyclerView.OnScrollListener 滑动 逻辑需要在修改
- 关于android手机system/build.prop的浅析
- Python3爬虫从入门到自残(二):HTML及其解析