RecyclerView的功能扩展(Android图片选择器)

本文介绍了如何在Android应用中创建一个图片选择器,利用媒体数据库获取图片路径,结合Glide加载图片到RecyclerView。工程包括图片数量限制、预览功能,并提供在码云git上的源码链接。
摘要由CSDN通过智能技术生成

Android 应用程序开发中总会遇到从本地选择照片的操作,本文描述得是一个简单得图片选择器
支持设置图片张数、可以设置屏蔽得图片格式、图片预览。更多的功能正在开发中,项目已放到:码云git上 我也在随时更新这个项目。下面就简单地介绍下这个内容。

效果图片
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
工程逻辑简述

实现原理则是,使用Android提供的媒体数据库,将图片资源的地址(存在本地的绝对地址(路径))提取出来,再使用Glide图片加载框架,将图片加载到RecyclerView列表中。
对于Glide框架和RecyclerView可以添加如下依赖(若遇到依赖版本问题就自行解决咯)

//Glide
compile 'com.github.bumptech.glide:glide:3.7.0'
//RecyclerView
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'

以上便是这个工程的基本思路

获取图片地址(路径)

package com.util.photopicker.util;

import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;

import com.util.photopicker.bean.ImageBean;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by eric on 2017/12/3.
 */

public class ImageFinder {
   
    public static final String NONE = "none";
    public static final String TYPE_GIF = "image/gif";
    public static final String TYPE_JPEG = "image/jpeg";
    public static final String TYPE_jpg = "image/jpg";
    public static final String TYPE_PNG = "image/png";

    //第二个参数是配置需要屏蔽的图片格式
    public static List<ImageBean> getImages(Context context, String typeShield){
        String shield = typeShield;
        List<ImageBean> list = new ArrayList<>();
        Cursor cursor = context.getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
        while (cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
            String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            String type = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.MIME_TYPE));

            if (type.equals(shield)) continue;
            list.add(0,new ImageBean(path,name));
        }
        return list;
    }
}

若是以上这个类看的头大,那我们只用知道一下这几行核心代码就OK了

 Cursor cursor = context.getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
        while (cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
            String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            String type = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.MIME_TYPE));

        }

以上便是通过Android为我们提供的媒体数据库来查询图片的name,path,type。当然还有更多的图片属性可以获取,例如文件大小等信息,但我们这儿暂时只需要这些就够了。除此之外,还得有个Bean类来存放我们得到的单个数据,然后放在一个List里,再返回这个list;Bean类如下

package com.util.photopicker.bean;

/**
 * Created by eric on 2017/12/3.
 */

public class ImageBean {
   
    private String imagePath;
    private String imageName;
    private boolean isChoose = false;
    public ImageBean(String path, String name){
        this.imagePath = path;
        this.imageName = name;
    }

    public String getImagePath() {
        return imagePath;
    }

    public void setImagePath(String imagePath) {
        this.imagePath = imagePath;
    }

    public String getImageName() {
        return imageName;
    }

    public void setImageName(String imageName) {
        this.imageName = imageName;
    }

    public boolean isChoose() {
        return isChoose;
    }

    public void setChoose(boolean choose) {
        isChoose = choose;
    }
}

当我们拿到了这个list之后就可以用列表的形式展示出来了,这里我采用的是RecyclerView,当然可以用其他的控件来代替,这里就自行考虑了。

RecyclerView
我都知道,RecyclerView简单易用,但是这个还是没法满足我们的需求,以下是对RecyclerView 的 adapter的一点小小的扩展。

package com.util.photopicker.component;

import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by eric on 2017/12/4.
 */

public abstract class BaseViewHolder extends RecyclerView.ViewHolder {
   
    public BaseViewHolder(View itemView) {
        super(itemView);
        findViewById(itemView);
    }

    /**
     * 转发传入的OnItemChooseCallback与位置
     * @param chooseCallback 点击回调
     * @param position 位置
     */
    public void setChooseCallback(OnItemChooseCallback chooseCallback,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值