在记录之前先放上原作的GitHub项目地址:ImagePicker

南尘的框架写得相当不错,我们可以在我们的项目中添加依赖直接使用,但是我在使用的时候发现了一个小bug,就在图片预览的界面选择了图片后,点击返回到所有图片界面时,在预览被选中的图片的CheckBox没有勾上,但是图片是确实已经添加上去了,于是我在他源码的基础上进行了修改,但是我感觉我修改的方法有点low,欢迎大神指点更高级的修改方法。

首先先来说一下这个框架怎么使用,因为这里我要修改源码,所以我直接将源码的module导入到我的工程了,然后在gradle里面加一句:compile project(':imagepicker')

另外,我用了glide框架来加载图片,所以还要加上:compile 'com.github.bumptech.glide:glide:3.7.0'

假设我们添加图片的界面就是MainActivity,所以先上其布局代码activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="16dp"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"android:choiceMode="singleChoice"android:divider="@null"android:fadingEdge="none"android:listSelector="@android:color/transparent"android:scrollbarStyle="outsideOverlay"app:layoutManager="android.support.v7.widget.GridLayoutManager"app:spanCount="4"tools:listitem="@layout/list_item_image"/>
</RelativeLayout>

其次先新建两个工具类

第一个是图片的加载器,这里我使用的是Glide加载:GlideImageLoader

package demo.yang.com.myimagepicker;import android.app.Activity;
import android.net.Uri;
import android.widget.ImageView;import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.lzy.imagepicker.loader.ImageLoader;import java.io.File;/*** Created by yxy on 2017/4/10.* email:1084625746@qq.com*/public class GlideImageLoader implements ImageLoader {@Overridepublic void displayImage(Activity activity, String path, ImageView imageView, int width, int height) {Glide.with(activity).load(Uri.fromFile(new File(path))).error(R.mipmap.f).placeholder(R.mipmap.f).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);}@Overridepublic void clearMemoryCache() {}
}

至于里面的error和placeholder的图片资源大家就自己随便放吧

第二个是一个自定义dialog(这个是南尘大神写的):SelectDialog

package demo.yang.com.myimagepicker;import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;import java.util.List;/*** 选择对话框** Author: nanchen* Email: liushilin520@foxmail.com* Date: 2017-03-22  11:38*/public class SelectDialog extends Dialog implements OnClickListener,OnItemClickListener {private SelectDialogListener mListener;private Activity mActivity;private Button mMBtn_Cancel;private TextView mTv_Title;private List<String> mName;private String mTitle;private boolean mUseCustomColor = false;private int mFirstItemColor;private int mOtherItemColor;public interface SelectDialogListener {public void onItemClick(AdapterView<?> parent, View view, int position, long id);}/*** 取消事件监听接口**/private SelectDialogCancelListener mCancelListener;public interface SelectDialogCancelListener {public void onCancelClick(View v);}public SelectDialog(Activity activity, int theme,SelectDialogListener listener, List<String> names) {super(activity, theme);mActivity = activity;mListener = listener;this.mName=names;setCanceledOnTouchOutside(true);}/*** @param activity 调用弹出菜单的activity* @param theme 主题* @param listener 菜单项单击事件* @param cancelListener 取消事件* @param names 菜单项名称**/public SelectDialog(Activity activity, int theme, SelectDialogListener listener, SelectDialogCancelListener cancelListener , List<String> names) {super(activity, theme);mActivity = activity;mListener = listener;mCancelListener = cancelListener;this.mName=names;// 设置是否点击外围不解散setCanceledOnTouchOutside(false);}/*** @param activity 调用弹出菜单的activity* @param theme 主题* @param listener 菜单项单击事件* @param names 菜单项名称* @param title 菜单标题文字**/public SelectDialog(Activity activity, int theme, SelectDialogListener listener, List<String> names, String title) {super(activity, theme);mActivity = activity;mListener = listener;this.mName=names;mTitle = title;// 设置是否点击外围可解散setCanceledOnTouchOutside(true);}public SelectDialog(Activity activity, int theme, SelectDialogListener listener, SelectDialogCancelListener cancelListener, List<String> names, String title) {super(activity, theme);mActivity = activity;mListener = listener;mCancelListener = cancelListener;this.mName=names;mTitle = title;// 设置是否点击外围可解散setCanceledOnTouchOutside(true);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);View view = getLayoutInflater().inflate(R.layout.view_dialog_select,null);setContentView(view, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));Window window = getWindow();// 设置显示动画window.setWindowAnimations(R.style.main_menu_animstyle);WindowManager.LayoutParams wl = window.getAttributes();wl.x = 0;wl.y = mActivity.getWindowManager().getDefaultDisplay().getHeight();// 以下这两句是为了保证按钮可以水平满屏wl.width = LayoutParams.MATCH_PARENT;wl.height = LayoutParams.WRAP_CONTENT;// 设置显示位置onWindowAttributesChanged(wl);initViews();}private void initViews() {DialogAdapter dialogAdapter=new DialogAdapter(mName);ListView dialogList=(ListView) findViewById(R.id.dialog_list);dialogList.setOnItemClickListener(this);dialogList.setAdapter(dialogAdapter);mMBtn_Cancel = (Button) findViewById(R.id.mBtn_Cancel);mTv_Title = (TextView) findViewById(R.id.mTv_Title);mMBtn_Cancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif(mCancelListener != null){mCancelListener.onCancelClick(v);}dismiss();}});if(!TextUtils.isEmpty(mTitle) && mTv_Title != null){mTv_Title.setVisibility(View.VISIBLE);mTv_Title.setText(mTitle);}else{mTv_Title.setVisibility(View.GONE);}}@Overridepublic void onClick(View v) {dismiss();}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {mListener.onItemClick(parent, view, position, id);dismiss();}private class DialogAdapter extends BaseAdapter {private List<String> mStrings;private Viewholder viewholder;private LayoutInflater layoutInflater;public DialogAdapter(List<String> strings) {this.mStrings = strings;this.layoutInflater=mActivity.getLayoutInflater();}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mStrings.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn mStrings.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (null == convertView) {viewholder=new Viewholder();convertView=layoutInflater.inflate(R.layout.view_dialog_item, null);viewholder.dialogItemButton=(TextView) convertView.findViewById(R.id.dialog_item_bt);convertView.setTag(viewholder);}else{viewholder=(Viewholder) convertView.getTag();}viewholder.dialogItemButton.setText(mStrings.get(position));if (!mUseCustomColor) {mFirstItemColor = mActivity.getResources().getColor(R.color.blue);mOtherItemColor = mActivity.getResources().getColor(R.color.blue);}if (1 == mStrings.size()) {viewholder.dialogItemButton.setTextColor(mFirstItemColor);viewholder.dialogItemButton.setBackgroundResource(R.drawable.dialog_item_bg_only);} else if (position == 0) {viewholder.dialogItemButton.setTextColor(mFirstItemColor);viewholder.dialogItemButton.setBackgroundResource(R.drawable.select_dialog_item_bg_top);} else if (position == mStrings.size() - 1) {viewholder.dialogItemButton.setTextColor(mOtherItemColor);viewholder.dialogItemButton.setBackgroundResource(R.drawable.select_dialog_item_bg_buttom);} else {viewholder.dialogItemButton.setTextColor(mOtherItemColor);viewholder.dialogItemButton.setBackgroundResource(R.drawable.select_dialog_item_bg_center);}return convertView;}}public static class Viewholder {public TextView dialogItemButton;}/*** 设置列表项的文本颜色*/public void setItemColor(int firstItemColor, int otherItemColor) {mFirstItemColor = firstItemColor;mOtherItemColor = otherItemColor;mUseCustomColor = true;}
}

这个里面会用到一些style,添加到style.xml里面:

<style name="main_menu_animstyle"><item name="android:windowEnterAnimation">@anim/photo_dialog_in_anim</item><item name="android:windowExitAnimation">@anim/photo_dialog_out_anim</item></style><style name="transparentFrameWindowStyle" parent="android:style/Theme.Dialog"><item name="android:windowBackground">@drawable/photo_choose_bg</item></style>

在res文件夹下新建anim文件夹,新建两个xml文件:photo_dialog_in_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" ><translateandroid:duration="200"android:fromXDelta="0"android:fromYDelta="1000"android:toXDelta="0"android:toYDelta="0" /></set>

photo_dialog_out_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" ><translateandroid:duration="300"android:fromXDelta="0"android:fromYDelta="0"android:toXDelta="0"android:toYDelta="1000" /></set>

然后在drawable文件夹里新建photo_choose_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#00000000"/><corners android:radius="20dp"/><paddingandroid:bottom="5dp"android:left="5dp"android:right="5dp"android:top="5dp"/></shape>

新建一个layout文件:view_dialog_select.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#00000000"android:gravity="bottom"android:orientation="vertical"android:padding="5dip" ><TextViewandroid:id="@+id/mTv_Title"android:layout_width="match_parent"android:layout_height="68dp"android:layout_marginTop="5dip"android:background="@drawable/dialog_item_bg_only"android:padding="10dip"android:textColor="#0073FF"android:textSize="18sp"android:gravity="center"android:visibility="gone"/><ListViewandroid:id="@+id/dialog_list"android:layout_width="match_parent"android:dividerHeight="0.5dp"android:divider="#DAD9DB"android:layout_marginTop="5dip"android:listSelector="@android:color/transparent"android:cacheColorHint="@android:color/transparent"android:layout_height="wrap_content" ></ListView><Buttonandroid:id="@+id/mBtn_Cancel"android:layout_width="match_parent"android:layout_height="40dp"android:layout_marginTop="5dip"android:background="@drawable/dialog_item_bg_only"android:text="取消"android:gravity="center"android:textColor="#0073FF"android:textSize="18sp" /></LinearLayout>

以及对应ListView的item的layout:view_dialog_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/dialog_item_bt"android:layout_width="match_parent"android:layout_height="40dp"android:gravity="center"android:textColor="#0073FF"android:textSize="18sp" />
</RelativeLayout>

还有四个按钮的背景样式

只有一列时:dialog_item_bg_only.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape><solid android:color="#CACACB" /><corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" /></shape></item><item><shape><solid android:color="#EBEBEB" /><corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" /></shape></item></selector>

多条数据时,第一条数据的背景:select_dialog_item_bg_top.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape><solid android:color="#CACACB" /><corners android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" /></shape></item><item><shape><solid android:color="#EBEBEB" /><corners android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" /></shape></item></selector>

多条数据时,最后一条数据的背景:select_dialog_item_bg_buttom.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape><solid android:color="#CACACB" /><corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="0dp" android:topRightRadius="0dp" /></shape></item><item><shape><solid android:color="#EBEBEB" /><corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="0dp" android:topRightRadius="0dp" /></shape></item></selector>

多条数据时,中间数据的背景:select_dialog_item_bg_center.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape><solid android:color="#CACACB" /></shape></item><item><shape><solid android:color="#EBEBEB" /></shape></item></selector>

工具类添加完后,就可以写显示我们已选择的图片的适配器了:ImagePickerAdapter

package demo.yang.com.myimagepicker;import android.app.Activity;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;import com.lzy.imagepicker.ImagePicker;
import com.lzy.imagepicker.bean.ImageItem;import java.util.ArrayList;
import java.util.List;/*** Created by yxy on 2017/4/10.* email:1084625746@qq.com*/public class ImagePickerAdapter extends RecyclerView.Adapter<ImagePickerAdapter.SelectedPicViewHolder>{private OnRecyclerViewItemClickListener listener;private int maxImgCount;private Context context;private List<ImageItem> mData;private LayoutInflater mInflater;private boolean isAdded;//是否还能添加图片public ImagePickerAdapter(int maxImgCount, Context context, List<ImageItem> mData) {this.maxImgCount = maxImgCount;this.context = context;this.mInflater = LayoutInflater.from(context);setImages(mData);}public void setImages(List<ImageItem> data){mData = new ArrayList<>(data);if (getItemCount()<maxImgCount){mData.add(new ImageItem());isAdded = true;}else{isAdded = false;}notifyDataSetChanged();}//返回已选的所有图片public List<ImageItem> getImages(){if (isAdded)return new ArrayList<>(mData.subList(0,mData.size()-1));elsereturn mData;}@Overridepublic SelectedPicViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new SelectedPicViewHolder(mInflater.inflate(R.layout.list_item_image,parent,false));}@Overridepublic void onBindViewHolder(SelectedPicViewHolder holder, int position) {holder.bind(position);}@Overridepublic int getItemCount() {return mData.size();}public interface OnRecyclerViewItemClickListener{void onItemClick(View view,int position);}public void setOnItemClickListener(OnRecyclerViewItemClickListener listener){this.listener = listener;}public class SelectedPicViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {private ImageView img;private int clickPosition;public SelectedPicViewHolder(View itemView) {super(itemView);img = (ImageView) itemView.findViewById(R.id.img);}public void bind(int position){itemView.setOnClickListener(this);ImageItem item = mData.get(position);if (isAdded&&position==getItemCount()-1){img.setImageResource(R.drawable.selector_image_add);clickPosition = MainActivity.IMAGE_ITEM_ADD;}else{ImagePicker.getInstance().getImageLoader().displayImage((Activity) context,item.path,img,0,0);clickPosition = position;}}@Overridepublic void onClick(View view) {if (listener!=null){listener.onItemClick(view,clickPosition);}}}
}

这里面的排版就看自己的项目需求了,因为我MainActivity的布局只写了一个RecyclerView,所以我的适配器就只放了一个ImageView:list_item_image.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:padding="5dp"android:layout_width="wrap_content"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/img"android:scaleType="centerCrop"android:src="@drawable/selector_image_add"android:layout_width="70dp"android:layout_height="70dp" /></LinearLayout>

在drawable文件夹里面新建一个selector_image_add.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@mipmap/image_add_sel" android:state_focused="true"/><item android:drawable="@mipmap/image_add_sel" android:state_pressed="true"/><item android:drawable="@mipmap/image_add_sel" android:state_selected="true"/><item android:drawable="@mipmap/image_add_nor"/></selector>

下面是这两个图片资源

         

最后就是MainActivity的代码了

package demo.yang.com.myimagepicker;import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;import com.lzy.imagepicker.ImagePicker;
import com.lzy.imagepicker.bean.ImageItem;
import com.lzy.imagepicker.ui.ImageGridActivity;
import com.lzy.imagepicker.ui.ImagePreviewDelActivity;
import com.lzy.imagepicker.view.CropImageView;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity implements ImagePickerAdapter.OnRecyclerViewItemClickListener {public static final int IMAGE_ITEM_ADD = -1;//设置是否为添加图片的那个imagepublic static final int REQUEST_CODE_SELECT = 100;public static final int REQUEST_CODE_PREVIEW = 101;private ImagePickerAdapter adapter;private List<ImageItem> selImageList;//当前选择的所有图片private int maxImgCount = 8;//允许选择的图片最大数量@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initImagePicker();initWidget();}private void initImagePicker(){ImagePicker imagePicker = ImagePicker.getInstance();imagePicker.setImageLoader(new GlideImageLoader());//设置图片加载器imagePicker.setShowCamera(true);//显示拍照按钮imagePicker.setCrop(true);//允许裁剪(单选的时候才有效)imagePicker.setSaveRectangle(true);//是否按矩形区域保存imagePicker.setSelectLimit(maxImgCount);//选中数量限制imagePicker.setStyle(CropImageView.Style.RECTANGLE);//裁剪框的形状imagePicker.setFocusWidth(800);//裁剪框的宽度,单位像素imagePicker.setFocusHeight(800);//裁剪框的高度,单位像素imagePicker.setOutPutX(1000);//保存文件的宽度,单位像素imagePicker.setOutPutY(1000);//保存文件的高度,单位像素}private void initWidget(){RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);selImageList = new ArrayList<>();adapter = new ImagePickerAdapter(maxImgCount,this,selImageList);adapter.setOnItemClickListener(this);recyclerView.setLayoutManager(new GridLayoutManager(this,4));recyclerView.setHasFixedSize(true);recyclerView.setAdapter(adapter);}private SelectDialog showDialog(SelectDialog.SelectDialogListener listener,List<String> names){SelectDialog dialog = new SelectDialog(this,R.style.transparentFrameWindowStyle,listener,names);if (!this.isFinishing()){dialog.show();}return dialog;}@Overridepublic void onItemClick(View view, int position) {switch (position){case IMAGE_ITEM_ADD:List<String> names = new ArrayList<>();names.add("拍照");names.add("相册");showDialog(new SelectDialog.SelectDialogListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {switch (position){case 0://直接调起相机//打开选择,本次允许选择的数量ImagePicker.getInstance().setSelectLimit(maxImgCount - selImageList.size());Intent intent = new Intent(MainActivity.this, ImageGridActivity.class);intent.putExtra(ImageGridActivity.EXTRAS_TAKE_PICKERS,true);startActivityForResult(intent,REQUEST_CODE_SELECT);break;case 1://打开相册//打开选择,本次允许选择的数量ImagePicker.getInstance().setSelectLimit(maxImgCount - selImageList.size());Intent intent1 = new Intent(MainActivity.this,ImageGridActivity.class);startActivityForResult(intent1,REQUEST_CODE_SELECT);break;default:break;}}},names);break;default://打开预览Intent intentPreView = new Intent(this, ImagePreviewDelActivity.class);intentPreView.putExtra(ImagePicker.EXTRA_IMAGE_ITEMS,(ArrayList<ImageItem>)adapter.getImages());intentPreView.putExtra(ImagePicker.EXTRA_SELECTED_IMAGE_POSITION,position);intentPreView.putExtra(ImagePicker.EXTRA_FROM_ITEMS,true);startActivityForResult(intentPreView,REQUEST_CODE_PREVIEW);break;}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == ImagePicker.RESULT_CODE_ITEMS){//添加图片返回if (data!=null&&requestCode==REQUEST_CODE_SELECT){ArrayList<ImageItem> images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS);if (images!=null){selImageList.addAll(images);adapter.setImages(selImageList);Log.e("TAG", "onActivityResult: "+selImageList.get(0).path+"     "+selImageList.get(1).path );}}}else if (resultCode == ImagePicker.RESULT_CODE_BACK){//预览图片返回if (data!=null&&requestCode == REQUEST_CODE_PREVIEW){ArrayList<ImageItem> images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_IMAGE_ITEMS);if (images!=null){selImageList.clear();selImageList.addAll(images);adapter.setImages(selImageList);}}}}
}

最后就是我在源码上的修改了,

首先是ImageRecyclerAdapter.java,这里我只粘出我添加的代码,先写一个函数来更新CheckBox的状态

public void updatecheck(ImageViewHolder holder,int position){holder.cbCheck.setChecked(false);for (int j = 0;j<mSelectedImages.size();j++){if (mSelectedImages.get(j).equals(images.get(position-1))){holder.cbCheck.setChecked(true);}}}

然后在onBindViewHolder里面进行调用

接着是ImageGrideActivity.java,在activity的回调函数里面设置刷新,注意要放在resultCode为ImagePicker.RESULT_CODE_BACK的条件里面,即:

if (resultCode == ImagePicker.RESULT_CODE_BACK) {isOrigin = data.getBooleanExtra(ImagePreviewActivity.ISORIGIN, false);mRecyclerAdapter.notifyDataSetChanged();}

写到这儿,之前我所说的bug就解决了,另外发现,,,还有一个bug,,就是选择图片的预览界面的返回按钮点击后不会激起activity的回调,最后发现是没有findViewById,以及setOnClickListener,所以在ImagePreviewActivity初始化控件的时候添加上就可以了

mBtnBack = (ImageView) topBar.findViewById(R.id.btn_back);mBtnBack.setVisibility(View.VISIBLE);mBtnBack.setOnClickListener(this);

到这儿所有想要的效果就都实现了,欢迎各路大神指点。

使用南尘的ImagePicker实现仿微信的相册图片选择以及拍照上传相关推荐

  1. 仿朋友圈相册图片选择以及画廊效果

    仿朋友圈相册图片选择以及画廊效果 1.效果展示 2.导入相关第三方库依赖 3.编写选择图片页面 a.编写布局 b.编写Activity c.相册选择工具类部分代码 d.相册4宫图适配器 4.编写画廊页 ...

  2. 微信小程序图片(单图多图上传显示)

    微信小程序上传图片组件自定义 最近在做微信小程序开发的时候,遇到了一个问题,就是图片上传于显示问题,微信自带的感觉用起来还是不方便,于是就萌生了自定义图片上传于显示组件 废话不多说直接上代码 首先创建 ...

  3. Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传

    仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 如果不知道如何上传 ...

  4. android com.mylhyl,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. photopicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  5. android 微信高仿,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  6. Android仿微信实现快速索引选择联系人

    Android仿微信实现快速索引选择联系人 原创 2016年03月05日 13:19:20 1640 3 1 一.概述 先看效果图,然后在给大家慢慢介绍  二.实现 先给大家说说这些城市的数据是怎么来 ...

  7. 手机相机和相册:仿微信自定义相册

    手机相册的展示能满足大部分需求,但是就是有那么些产品经理想搞事情.要仿照微信的自定义相册来做.没办法,产品的合理需求必须要满足.现在咱们开始搞-- 一.仿微信自定义相册界面 原谅道长的无能,不能把做的 ...

  8. Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果

    转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18730223),请尊重他人的辛勤劳动成果,谢谢! 写这篇文 ...

  9. android 仿微信选取相册_Android类似微信图片选择器

    很多项目要用到图片选择控件,每次都要写一大堆逻辑.于是基于图片选择组件(PhotoPicker)封装了一个控件PhotoUploadView.方便简易,一键集成,几句代码就可以添加类似微信的图片选择控 ...

最新文章

  1. 【福利】Java 依然很牛逼!
  2. 一文详解随机一致性采样算法:RANSAC
  3. stm32 工业按键检测_「正点原子STM32Mini板资料连载」第七章 按键输入实验
  4. SQL的不合理有效性
  5. 返璞归真的Open×××的p2p模式
  6. 女主计算机的学霸,又一部青春网剧开机,学霸女主牵手计算机大神,另类爱情精彩上演...
  7. iOS Hacker Xcode7免登录开发者账号打包ipa
  8. Clash Royale开发日志
  9. java testng 源代码_根据测试用例的java源码自动生成TestNG的XML文件
  10. mysql数据库集群备份策略_mysql高可用方案之集群(cluster)
  11. php 字符串中 数组变量,PHP返回变量或数组的字符串表示:var_export()
  12. 一个Android上的弹幕控件Open Danmaku
  13. C#压缩指定的文件并生成zip文件
  14. 《匠人手记》里的10种软件滤波
  15. 精选黑科技资源站点,总会有你需要的干货!
  16. 麒麟V10系统-系统激活点击按钮无响应
  17. xay loves or
  18. 【官方文档】Fluent Bit 数据管道之过滤插件(Kubernetes)
  19. unity 调用打印机打印图片问题
  20. linux sdb空间转移,Linux系统sda变sdb的解决

热门文章

  1. 机器学习模型保存之joblib、pckle报错问题
  2. ChatGPT和GPT-4带你选笔记本电脑
  3. 原码-反码-补码转换
  4. 爬爬爬 —— beautifulsoup
  5. 科技的成就(二十三)
  6. 5G和5GHz的区别
  7. 学管理的学生必懂的东东
  8. 翻开新的篇章 - 启程
  9. 一行代码将网页变成灰色
  10. 学习Windows Phone 7手机开发:迷你手电筒程序