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

来源:互联网 发布:泰德奥plc编程软件 编辑:程序博客网 时间:2024/05/17 22:52

在记录之前先放上原作的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(mTitle);        }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 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);

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






















1 0
原创粉丝点击