您的位置:首页 > 移动开发 > 微信开发

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

2017-04-13 19:28 866 查看
在记录之前先放上原作的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"?>
<RelativeLayout
xmlns: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.RecyclerView
android: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 {
@Override
public 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);
}

@Override
public 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);
}

@Override
protected 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() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(mCancelListener != null){
mCancelListener.onCancelClick(v);
}
dismiss();
}
});

if(!TextUtils.isEmpty(mTitle) && mTv_Title != null){
mTv_Title.setVisibility(View.VISIBLE);
mTv_Title.setText(mTi
4000
tle);
}else{
mTv_Title.setVisibility(View.GONE);
}
}

@Override
public void onClick(View v) {
dismiss();

}

@Override
public 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();
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return mStrings.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mStrings.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public 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" >

<translate
android: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" >

<translate
android: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"/>

<padding
android: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" >

<TextView
android: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"/>

<ListView
android: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>

<Button
android: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"
>

<TextView
android: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));
else
return mData;
}

@Override
public SelectedPicViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new SelectedPicViewHolder(mInflater.inflate(R.layout.list_item_image,parent,false));
}

@Override
public void onBindViewHolder(SelectedPicViewHolder holder, int position) {
holder.bind(position);
}

@Override
public 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;
}
}

@Override
public 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">

<ImageView
android: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;//设置是否为添加图片的那个image
public static final
bc2d
int REQUEST_CODE_SELECT = 100;
public static final int REQUEST_CODE_PREVIEW = 101;

private ImagePickerAdapter adapter;
private List<ImageItem> selImageList;//当前选择的所有图片
private int maxImgCount = 8;//允许选择的图片最大数量

@Override
protected 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;
}

@Override
public 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() {
@Override
public 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;
}
}

@Override
protected 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);
到这儿所有想要的效果就都实现了,欢迎各路大神指点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐