android 获取本地全部图片列表的实现及源码下载(一)

原创 2015年03月07日 21:39:13

我的前面几个博文中已经介绍过了如何获取本地图片和Bitmap、软引用、弱引用的使用方法。在这两个博文当中针对一个完整的Demo示例给大家讲解获取本地图片的非常有效、也是安卓官方推荐的方法。

**源代码在博文最后可以下载**。

效果图如下:
这里写图片描述
滑动过程中不进行图片的加载,效果图如下:
这里写图片描述
整个Demo只有一个Activity中完成,加载本地图片在GridView中进行显示,同时点击每个图片可以对图片进行选中的操作,每个item图片右上角会给出对号的提示,表示选中图片。所以整个布局界面也很简单,所以就不给出xml的布局文件了。
先给出Activity的代码如下:

/**
 * 多图选择的界面
 */
public class GridImage extends FragmentActivity {
    private final static String RESULT_URIS = "result_uris";
    private final static String INTENT_CLAZZ = "clazz";
    private Class clazz; //需要跳转的Activity类对象
    private ImageWorker imageWorker;//下载图片的异步线程类
    private ArrayList<Uri> uriArray = new ArrayList<Uri>();//存放图片的uri数据
    private ArrayList<Long> origIdArray = new ArrayList<Long>();//存放图片的id
    private TreeMap<Long, Uri> selectedTree = new TreeMap<Long, Uri>();//存放已选中的图片的id和uri数据

    /**
    这个是SelectedTreeMap 的代码,非常简单的一个序列化元素。用于存放已经选中的图片TreeMap<Long, Uri> selectedTree
   public class SelectedTreeMap implements Serializable {
    private TreeMap<Long, Uri> treeMap;
    public TreeMap<Long, Uri> getTreeMap() {
        return treeMap;
    }
    public void setTreeMap(TreeMap<Long, Uri> treeMap) {
        this.treeMap = treeMap;
    }
    }
    */
    private SelectedTreeMap selectedTreeMap = new SelectedTreeMap();

    private ImageAdapter adapter;
    private GridView gridView;
    private View loadView;//进度条View
    private Button doneBtn;
    private TextView selectedNum;
    private LoadLoacalPhotoCursorTask cursorTask;//获取本地图片数据的异步线程类
    private AlphaAnimation inAlphaAni;//每个图片加载时渐隐渐显的效果动画
    private AlphaAnimation outAlphaAni;//每个图片加载时渐隐渐显的效果动画

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); //To change body of overridden methods use File | Settings | File Templates.
        setContentView(R.layout.sdcard);
        createView();
        init();
    }

    /**
     * 创建视图
     * 整个布局包含四个组件,很简单
     */
    private void createView() {
        gridView = (GridView) findViewById(R.id.sdcard);
        loadView = findViewById(R.id.load_layout);
        doneBtn = (Button) findViewById(R.id.ok_btn);
        selectedNum = (TextView) findViewById(R.id.selected_num);
    }

    /**
     * 初始化
     * 其中的 getIntent().getExtras();为null,所以clazz=null。这里是为了方便复用该Activity。
     */
    private void init() {
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
            clazz = (Class) bundle.get(INTENT_CLAZZ);
        }else {
   Log.i(GridImage.class.getSimpleName(), "bundle == null");
  }
        imageWorker = new ImageWorker(this);
        //这个bitmap是GridView中每一个item默认时的图片
        Bitmap b = Bitmap.createBitmap(new int[]{0x00000000}, 1, 1, Bitmap.Config.ARGB_8888);
        imageWorker.setLoadBitmap(b);
        adapter = new ImageAdapter(imageWorker, this);
        gridView.setAdapter(adapter);
        loadData();
        initAnimation();
        onItemClick();
        onScroll();
        doneClick();
    }

    /**
     * GridView中每个item图片加载初始化动画-渐隐渐显的效果
     */
    private void initAnimation() {
        float fromAlpha = 0;
        float toAlpha = 1;
        int duration = 200;
        inAlphaAni = new AlphaAnimation(fromAlpha, toAlpha);
        inAlphaAni.setDuration(duration);
        inAlphaAni.setFillAfter(true);
        outAlphaAni = new AlphaAnimation(toAlpha, fromAlpha);
        outAlphaAni.setDuration(duration);
        outAlphaAni.setFillAfter(true);
    }

    /**
     * 加载数据
     */
    private void loadData() {
        cursorTask = new LoadLoacalPhotoCursorTask(this);//获取本地图片的异步线程类
        /**
         * 回调接口。当完成本地图片数据的获取之后,回调LoadLoacalPhotoCursorTask类中的OnLoadPhotoCursor接口    
         * 的onLoadPhotoSursorResult方法,把数据传递到了这里。
         */
        cursorTask.setOnLoadPhotoCursor(new LoadLoacalPhotoCursorTask.OnLoadPhotoCursor() {
            @Override
            public void onLoadPhotoSursorResult(ArrayList<Uri> uriArray, ArrayList<Long> origIdArray) {
                if (isNotNull(uriArray) & isNotNull(origIdArray)) {
                    GridImage.this.uriArray = uriArray;
                    GridImage.this.origIdArray = origIdArray;
                    loadView.setVisibility(View.GONE);
                    adapter.setOrigIdArray(origIdArray);
                    adapter.notifyDataSetChanged();
                }
            }
        });
        cursorTask.execute();
    }

    /**
     * 点击每一项选择图片
     */
    private void onItemClick() {
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                CheckBox selectBtn = (CheckBox) view.findViewById(R.id.select_btn);
                boolean checked = !selectBtn.isChecked();
                selectBtn.setChecked(checked);
                //adapter中保存已经点击过的图片的选中情况
                adapter.putSelectMap(id, checked);
                Uri uri = uriArray.get(position);
                if (checked) {
                    selectedTree.put(id, uri);
                } else {
                    selectedTree.remove(id);
                }
                if (doneBtn.getVisibility() == View.GONE
                        && selectedTree.size() > 0) {
                    doneBtn.startAnimation(inAlphaAni);
                    doneBtn.setVisibility(View.VISIBLE);
                } else if (doneBtn.getVisibility() == View.VISIBLE
                        && selectedTree.size() == 0) {
                    doneBtn.startAnimation(outAlphaAni);
                    doneBtn.setVisibility(View.GONE);
                }
                CharSequence text = selectedTree.size() == 0 ? "" : "已选择 " + selectedTree.size() + " 张";
                selectedNum.setText(text);
            }
        });
    }

    /**
     * 滚动的时候不加载图片-该功能通过imageWorker中锁机制实现的。
     */
    private void onScroll() {
        gridView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                //SCROLL_STATE_IDLE表示停止滚动。
                if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                    imageWorker.setPauseWork(false);
                } else {
                    imageWorker.setPauseWork(true);
                }
            }
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            }
        });
    }

    /**
     * 点击“完成”-完成事件,由于clazz==null 所以该方法并不实现什么功能。
     */
    private void doneClick() {
        doneBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (clazz != null) {
                    selectedTreeMap.setTreeMap(selectedTree);
                    Intent intent = new Intent(GridImage.this, clazz);
                    Bundle bundle = new Bundle();
                    bundle.putSerializable(RESULT_URIS, selectedTreeMap);
                    intent.putExtras(bundle);
                    startActivity(intent);
                }else {
     Log.i(GridImage.class.getSimpleName(), "clazz==null");
    }
            }
        });

    }

    /**
     * 判断list不为空
     * @param list
     * @return
     */
    private static boolean isNotNull(ArrayList list) {
        return list != null && list.size() > 0;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        cursorTask.setExitTasksEarly(true);
        imageWorker.setExitTasksEarly(true);
    }
}

下面给出ImageAdapter的代码:

public class ImageAdapter extends BaseAdapter {
    private ImageWorker imageWorker;

    private HashMap<Long, Boolean> seletedMap = new HashMap<Long, Boolean>();
    private ArrayList<Long> origIdArray = new ArrayList<Long>();

    private LayoutInflater mInflater;
    //构造器
    public ImageAdapter(ImageWorker imageWorker, Context context) {
        this.imageWorker = imageWorker;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return origIdArray.size();
    }

    @Override
    public Object getItem(int position) {
        return origIdArray.get(position);
    }

    @Override
    public long getItemId(int position) {
        return origIdArray.get(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.item, parent, false);

            holder = new ViewHolder();
            holder.img = (ImageView) convertView.findViewById(R.id.imageView);
            holder.select = (CheckBox) convertView.findViewById(R.id.select_btn);
            convertView.setTag(R.id.holder_tag, holder);
        } else {
            holder = (ViewHolder) convertView.getTag(R.id.holder_tag);
        }
        final long origId = origIdArray.get(position);
        holder.select.setChecked(seletedMap.containsKey(origId) ? seletedMap.get(origId) : false);
        //加载图片
        imageWorker.loadImage(origId, holder.img);
        return convertView;
    }

    public ImageAdapter putSelectMap(Long origId, Boolean isChecked) {
        seletedMap.put(origId, isChecked);
        return this;
    }

    public ImageAdapter setOrigIdArray(ArrayList<Long> origIdArray) {
        this.origIdArray = origIdArray;
        return this;
    }

    public class ViewHolder {
        ImageView img;
        CheckBox select;
    }
}

下面内容请链接到下一篇博文

源代码下载

版权声明:本文为博主【龙吟在天】原创文章,未经博主允许不得转载。

相关文章推荐

Android-获取手机上所有图片

核心代码: Cursor cursor = getContentResolver().query( MediaStore.Images.Media.EXTERNAL_...

android从手机内存获得图片并全屏显示

java部分代码: package com.xpc.imageviewdemo; import java.io.File; import android.app.Activity; import...

android之ListView和adapter配合显示图片和文字列表

listView页面布局:layout/activity_main.xml:     xmlns:tools="http://schemas.android.com/tools"     an...

Android实现异步从网络加载图片列表

有时会有在加载ListView的时候,包含用户头像或其他需要到网络获取的图片信息,这时如果等待全部获取完成再显示会比较慢,很影响用户体验,所以这时就需要利用到异步加载图片的方法。 今天整理的方法...

动态显示带图片列表【Android】

一.功能描述:         1. 动态获取服务器端商品信息显示         2. 动态加载服务器端图片显示 二.技术点: ListView+BaseAdapterJSON数据解析H...

Android多媒体学习二:检索Android的图片库,并显示

上一篇中实例讲解了Android中的Camera的调用和图片的存储,这篇文章,我们将学习如何检索并显示媒体库中的图片。闲话少说,看代码:package demo.camera; import and...

一个简单的Android图片处理Demo

功能:Android中常用的图片选择(相册、拍照)与处理(贴图、滤镜、裁剪、旋转、保存)...
  • yzx0xyz
  • yzx0xyz
  • 2015年07月30日 18:25
  • 2049

Android中读取系统图库(包含相册)中的图片,显示图片与图片的路径

最近有一个需求,是类似于手机相机的功能,拍照,多次拍照(调用系统相机只能进行一次拍照),拍照页面显示一个拍照后的缩略图,点击缩略图后进行拍过的照片的筛选(有单选和多选的问题),以及后续操作(设计相关业...
  • ABC__D
  • ABC__D
  • 2016年06月30日 15:48
  • 14419

Android_优化查询加载大数量的本地相册图片

在讲解优化查询相册图片之前,我们先来看下PM提出的需求,PM的需求很简单,就是要做一个类似微信的本地相册图片查询控件,主要包含两个两部分: 进入图片选择页面就要显示出手机中所有的照片,包括系统相册图片...

我的Android心得(6)--从相册中选择图片显示出来

这里讲的很详细 http://blog.csdn.net/lincyang/article/details/6651582 同比例的缩放用...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 获取本地全部图片列表的实现及源码下载(一)
举报原因:
原因补充:

(最多只允许输入30个字)