Android 照片选择器(带序号)

做了个很简单的demo,适配器写好了相机相关的,但是功能没做,其他的根据需要去做优化

效果图如下:

image

需要权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

获取所有图片列表

/**
     * 获取照片列表
     * @param context
     * @return
     */
    public static List<PhotoPickBean> getAllPhoto(Context context){
        List<PhotoPickBean> photoList = new ArrayList<>();
        ContentResolver contentResolver = context.getContentResolver();
        Cursor cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA}, MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?", new String[]{"image/jpeg", "image/png"}, MediaStore.Images.Media._ID + " DESC");
        PhotoPickBean photoPickBean;
        if(cursor != null){
            while (cursor.moveToNext()) {
                String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                File file = new File(path);
                if (file.exists()) {
                    photoPickBean = new PhotoPickBean();
                    photoPickBean.setPhotoPath(path);
                    photoList.add(photoPickBean);
                }
            }
            cursor.close();
        }
        DialogUtil.dismissLoading();
        return photoList;
    }

Adapter适配器

public class AdapterPhotoPicker extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private int ITEM_NORMAL = 1;
    private int ITEM_CAMERA = 2;

    private Context context;
    private List<PhotoPickBean> dataList = new ArrayList<>();
    private IPhotoPicker iPhotoPicker;
    private LinkedHashMap<Integer, PhotoPickBean> pickMap = new LinkedHashMap<>();

    public AdapterPhotoPicker(Context context) {
        this.context = context;
    }

    public void setDataList(List<PhotoPickBean> dataList) {
        this.dataList = dataList;
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if(viewType == ITEM_NORMAL)
            return new PhotoVH(LayoutInflater.from(context).inflate(R.layout.item_photo, null));
        else
            return new PhotoVH(LayoutInflater.from(context).inflate(R.layout.item_photo_camera, null));
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        if(holder instanceof PhotoVH)
        {
            // 相册照片
            PhotoVH h = (PhotoVH) holder;
            h.rlPhoto.getLayoutParams().height = (int) ((MyApplication.getScreenWidth() - (context.getResources().getDimension(R.dimen.x30) * 4)) / 3);
            h.rlPhoto.setOnClickListener(new OnMultiClickListener() {
                @Override
                public void onMultiClick(View v) {
                    if(pickMap.containsKey(position))
                    {
                        pickMap.remove(position);
                    }else
                    {
                        if(pickMap.size() >= Constant.ALBUM_PICK_COUNT_MAX)
                        {
                            ToastUtil.showToast(context, "已");
                            return;
                        }
                        pickMap.put(position, dataList.get(position));
                    }
                    calculateCheckDataIndex();
                    if(iPhotoPicker != null)
                        iPhotoPicker.clickItem(position);
                    notifyDataSetChanged();
                }
            });
            if(pickMap.containsKey(position))
            {
                h.tvIndex.setSelected(true);
                h.tvIndex.setText((dataList.get(position).getOperateIndex() + 1) + "");
            }else{
                h.tvIndex.setSelected(false);
                h.tvIndex.setText("");
            }
            try {
                File file = new File(dataList.get(position).getPhotoPath());
                ImageLoader.load(file, h.rivPhoto);
            }catch (Exception e){}

        }else if(holder instanceof CameraVH)
        {
            // 相机
        }
    }

    private void calculateCheckDataIndex() {
        int p = 0;
        for (Map.Entry<Integer, PhotoPickBean> map: pickMap.entrySet())
        {
            PhotoPickBean bean = map.getValue();
            bean.setOperateIndex(p);
            int k = map.getKey();
            pickMap.put(k, bean);
            p++;
        }
    }

    public LinkedHashMap<Integer, PhotoPickBean> getCheckMap(){
        return pickMap;
    }

    @Override
    public int getItemViewType(int position) {
        if(dataList.get(position).getType() == 0)
            return ITEM_NORMAL;
        else return ITEM_CAMERA;
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    public class PhotoVH extends RecyclerView.ViewHolder{

        private RelativeLayout rlPhoto;
        private RoundedImageView rivPhoto;
        private TextView tvIndex;

        public PhotoVH(@NonNull View itemView) {
            super(itemView);
            rlPhoto = itemView.findViewById(R.id.rlPhoto);
            rivPhoto = itemView.findViewById(R.id.rivPhoto);
            tvIndex = itemView.findViewById(R.id.tvIndex);
        }
    }

    public class CameraVH extends RecyclerView.ViewHolder {

        public CameraVH(@NonNull View itemView) {
            super(itemView);
        }
    }

    public interface IPhotoPicker {
        void clickItem(int position); // 点击照片
        void clickCamera(); // 点击相机
    }
}

使用

private void initPhoto() {
        DialogUtil.showLoading(this);
// 耗时操作,必须异步,也可以在getAllPhoto方法中进行异步,通过handler或接口进行回调,插入数据需要在ui进程,此处为了方便,简单处理,实际操作尽量不这么做
        ablumThread = new Thread(new Runnable() {
            @Override
            public void run() {
                photoList = SystemUtil.getAllPhoto(ActivityPhotoPicker.this);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(photoList.size() > 0)
                        {
                            pickAdapter.setDataList(photoList);
                        }else
                        {
                            // 未查询到的处理
                        }
                    }
                });
            }
        });
        ablumThread.start();
    }

bean 对象

public class PhotoPickBean {

    private String photoPath;
    private int operateIndex;
    private int type; // 0照片 1相机

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getPhotoPath() {
        return photoPath;
    }

    public void setPhotoPath(String photoPath) {
        this.photoPath = photoPath;
    }

    public int getOperateIndex() {
        return operateIndex;
    }

    public void setOperateIndex(int operateIndex) {
        this.operateIndex = operateIndex;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容