关闭

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

标签: 获取本地图片android-图片android异步图片加载软-弱引用
5802人阅读 评论(4) 收藏 举报
分类:

我的前面几个博文中已经介绍过了如何获取本地图片和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;
    }
}

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

源代码下载

1
0
查看评论

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

listView页面布局:layout/activity_main.xml:     xmlns:tools="http://schemas.android.com/tools"     android:layout_width=&...
  • qa962839575
  • qa962839575
  • 2014-11-29 13:00
  • 25661

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

一.功能描述:         1. 动态获取服务器端商品信息显示         2. 动态加载服务器端图片显示 二.技术点: ListView+BaseAdapterJSON数据解析Handler+Thr...
  • lin14543
  • lin14543
  • 2016-08-08 09:30
  • 2164

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

我的前面几个博文中已经介绍过了如何获取本地图片和Bitmap、软引用、弱引用的使用方法。在这两个博文当中针对一个完整的Demo示例给大家讲解获取本地图片的非常有效、也是安卓官方推荐的方法。 **源代码在博文最后可以下载**。 效果图如下:    滑动过程中不进行图片...
  • syusikoku
  • syusikoku
  • 2016-09-11 18:35
  • 501

android 获取相册列表的实现及源码下载(一)

该项目实现的功能如下: 获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可以实现所选图片的上传等功能。 该项目最大特色: 1、获取相册列表,目前网络上面介绍获取相册的项目很少,本文专门讲述相册的获取。 2、使用And...
  • u010156024
  • u010156024
  • 2015-03-08 20:54
  • 11524

Android相册列表和栏目数据表的字段结构

一、先说一下相册列表的数据结构 _id=13343  _data=/storage/sdcard0/openfeint/webui/images/settings/button_radio_off.hdpi.png  _size=2555  _display_n...
  • hotlinhao
  • hotlinhao
  • 2014-08-08 16:35
  • 2361

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

有时会有在加载ListView的时候,包含用户头像或其他需要到网络获取的图片信息,这时如果等待全部获取完成再显示会比较慢,很影响用户体验,所以这时就需要利用到异步加载图片的方法。 今天整理的方法,是用Thread来进行加载,没有利用ThreadPool的方法,后面的方法以后再慢慢学一下吧,先把...
  • carterjin
  • carterjin
  • 2012-09-19 15:44
  • 8897

Android列表加载大量图片(一)

经过分析google官方提供sample:DisplayingBitmaps 。对其实现方式做个简单的总结。 在使用时,主要使用DisplayingBitmaps project下的util包下的ImageFetcher类。主要有两个点需要说明: 1、在列表滚动时,ImageFetch...
  • yuetingzhuying
  • yuetingzhuying
  • 2015-09-29 17:06
  • 782

Android图片加载库:最全面解析Glide用法

前言 上文已经对当今Android主流的图片加载库进行了全面介绍 & 对比 如果你还没阅读,我建议你先移步这里进行查看今天我们来学习一下其中一个Android主流的图片加载库的使用 - Glide 目录1. 简介 介绍:Glide,是Android中一个图片加载开源库 Google的...
  • carson_ho
  • carson_ho
  • 2016-09-25 18:11
  • 6076

【Android开发学习29】界面控件之列表控件(ListView)--显示图片和文本

  • 2013-03-19 10:07
  • 965KB
  • 下载

Android多张图片选择框架

Android图片选择器框架,支持多张,单张,拍照等返回选择的图片的uri,使用简单,效率高
  • lplj717
  • lplj717
  • 2017-03-01 15:18
  • 2803
    个人资料
    • 访问:396115次
    • 积分:4661
    • 等级:
    • 排名:第7429名
    • 原创:100篇
    • 转载:21篇
    • 译文:0篇
    • 评论:405条
    NS-3互动交流群

    扫描二维码:

    最新评论