本文转自:http://www.cnblogs.com/gergulo/archive/2011/06/14/2080629.html

之前项目需要实现一个可多选的图片列表,用户选中一到多张图片后,批量上传。但是网上有可多选普通列表的代码、也有单纯图片列表的代码,却没有两者合并的代码,只好自己实现一个。 
废话不说,直接上代码。
先是两个layout:

1、main.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="fill_parent"
 5     android:layout_height="fill_parent">
 6     <ListView 
 7         android:layout_width="fill_parent" 
 8         android:layout_height="fill_parent"
 9         android:focusable="false"
10         android:id="@+id/lvImageList" >
11     </ListView>
12 </LinearLayout>

2、listitem.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
 3     android:orientation="horizontal" 
 4     android:layout_width="fill_parent" 
 5     android:layout_height="?android:attr/listPreferredItemHeight">        
 6     <ImageView 
 7         android:id="@+id/itemImgImageInfo" 
 8         android:layout_marginTop="4dip"
 9         android:layout_marginBottom="4dip"
10         android:layout_width="?android:attr/listPreferredItemHeight"
11         android:layout_height="?android:attr/listPreferredItemHeight">
12     </ImageView>
13     <TwoLineListItem xmlns:android="http://schemas.android.com/apk/res/android" 
14         android:layout_width="fill_parent"
15         android:layout_height="fill_parent"
16         android:paddingLeft="4dip"
17         android:mode="twoLine">
18         <CheckedTextView 
19             android:id="@+id/itemChkImageInfo" 
20             android:layout_width="fill_parent" 
21             android:layout_height="wrap_content"
22             android:gravity="center_vertical"
23             android:textAppearance="?android:attr/textAppearanceSmall"
24             android:checkMark="?android:attr/listChoiceIndicatorMultiple">
25         </CheckedTextView>
26         <TextView 
27             android:id="@+id/itemTxtImageInfo"
28             android:layout_width="fill_parent"
29             android:layout_height="wrap_content"
30             android:gravity="center_vertical|top"
31             android:layout_marginBottom="4dip"
32             android:layout_below="@+id/itemChkImageInfo"
33             android:textAppearance="?android:attr/textAppearanceSmall">
34         </TextView>
35     </TwoLineListItem>
36 </LinearLayout>

接着是代码:
  1 package com.android.MultipleChoiceImageList;
  2 
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5 import java.util.List;
  6 import java.util.Map;
  7 
  8 import android.app.Activity;
  9 import android.content.Context;
 10 import android.database.Cursor;
 11 import android.graphics.Bitmap;
 12 import android.net.Uri;
 13 import android.os.Bundle;
 14 import android.provider.MediaStore;
 15 import android.provider.MediaStore.Images;
 16 import android.view.LayoutInflater;
 17 import android.view.View;
 18 import android.view.ViewGroup;
 19 import android.widget.AdapterView;
 20 import android.widget.CheckedTextView;
 21 import android.widget.ImageView;
 22 import android.widget.ListView;
 23 import android.widget.SimpleAdapter;
 24 import android.widget.TextView;
 25 import android.widget.AdapterView.OnItemClickListener;
 26 
 27 public class MainActivity extends Activity {
 28     
 29     private ListView lvImageList;
 30     
 31     private String imageID= "imageID";
 32     private String imageName = "imageName";
 33     private String imageInfo = "imageInfo";
 34     
 35     private ArrayList<String> fileNames = new ArrayList<String>();
 36     
 37     private MultipleChoiceImageListAdapter mAdapter;
 38     
 39     /** Called when the activity is first created. */
 40     @Override
 41     public void onCreate(Bundle savedInstanceState) {
 42         super.onCreate(savedInstanceState);
 43         setContentView(R.layout.main);
 44         
 45         lvImageList=(ListView) this.findViewById(R.id.lvImageList);
 46         lvImageList.setItemsCanFocus(false);
 47         lvImageList.setOnItemClickListener(new OnItemClickListener() {
 48             @Override
 49             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 50                 
 51                 CheckedTextView checkedTextView = (CheckedTextView) view.findViewById(R.id.itemChkImageInfo);
 52                 checkedTextView.toggle();
 53                 mAdapter.setCheckItem(position, checkedTextView.isChecked());
 54             }
 55         });
 56         try{
 57             String[] from = {imageID, imageName, imageInfo};
 58             int[] to = {R.id.itemImgImageInfo, R.id.itemChkImageInfo, R.id.itemTxtImageInfo};
 59             mAdapter = new MultipleChoiceImageListAdapter(MainActivity.this, GetImageList(), R.layout.listitem, from, to);
 60             lvImageList.setAdapter(mAdapter);
 61         }
 62         catch(Exception ex){
 63             return;
 64         }
 65     }
 66     
 67     //获取图片列表
 68     private ArrayList<Map<String, String>> GetImageList(){
 69         
 70         ArrayList<Map<String, String>> imageList = new ArrayList<Map<String,String>>();
 71         HashMap<String, String> imageMap;
 72         
 73         //读取SD卡中所有图片
 74         Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
 75         String[] projection = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME,MediaStore.Images.Media.DATA, MediaStore.Images.Media.SIZE};
 76         String selection = MediaStore.Images.Media.MIME_TYPE + "=?";
 77         String[] selectionArg ={"image/jpeg"};
 78         Cursor mCursor = this.managedQuery(uri, projection, selection, selectionArg, MediaStore.Images.Media.DISPLAY_NAME); 
 79         imageList.clear();
 80         if (mCursor != null) { 
 81             mCursor.moveToFirst();
 82             while (mCursor.getPosition() != mCursor.getCount()) 
 83             { 
 84                 imageMap= new HashMap<String, String>();
 85                 imageMap.put(imageID, mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media._ID)));
 86                 imageMap.put(imageName, mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME)));
 87                 imageMap.put(imageInfo, " " + (mCursor.getLong(mCursor.getColumnIndex(MediaStore.Images.Media.SIZE))/1024)+"KB");
 88                 imageList.add(imageMap);
 89                 fileNames.add(mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DATA)));
 90                 mCursor.moveToNext();   
 91             } 
 92             mCursor.close();
 93         }
 94         return imageList;
 95     }
 96     
 97     //可多选图片列表适配器
 98     class MultipleChoiceImageListAdapter extends SimpleAdapter {
 99 
100         private Map<Integer, Boolean> map; 
101         private List<Integer> state; 
102         private List<? extends Map<String, ?>> mList;
103         
104         LayoutInflater mInflater;
105         
106         public MultipleChoiceImageListAdapter(Context context, List<Map<String, String>> data, int resource, String[] from, int[] to) {
107             super(context, data, resource, from, to);
108             map = new HashMap<Integer, Boolean>();
109             mInflater = LayoutInflater.from(context);
110             mList = data;
111             for(int i = 0; i < data.size(); i++) {
112                 map.put(i, false);
113             } 
114             state = new ArrayList<Integer>();
115         }
116         
117         @Override
118         public int getCount() {
119             return mList.size();
120         }
121 
122         @Override
123         public Object getItem(int position) {
124             return position;
125         }
126 
127         @Override
128         public long getItemId(int position) {
129             return position;
130         }
131 
132         //设置条目选中状态
133         public void setCheckItem(int position, Boolean isChecked){
134             map.put(position, isChecked);
135             if (state.contains(position))
136                 state.remove((Object)position);
137             if (isChecked){
138                 state.add(position);
139             }
140         }
141         
142         //获取列表中已选中条目
143         public long[] getCheckItemIds(){
144             int count = state.size();
145             long[] ids = new long[count];
146             for (int i = 0; i < count; i++) {
147                 ids[i]= (long)state.get(i);
148             }
149             return ids;
150         }
151         
152         @Override
153         public View getView(int position, View convertView, ViewGroup parent) {
154             if(convertView == null) {
155                 convertView = mInflater.inflate(R.layout.listitem, null);
156             }
157             
158             CheckedTextView checkedTextView = (CheckedTextView) convertView.findViewById(R.id.itemChkImageInfo);
159             checkedTextView.setChecked(map.get(position)); 
160             checkedTextView.setText((String)mList.get(position).get(imageName));
161             
162             TextView textView = (TextView) convertView.findViewById(R.id.itemTxtImageInfo);
163             textView.setText((String)mList.get(position).get(imageInfo));
164             
165             //显示图片缩略图
166             ImageView image = (ImageView) convertView.findViewById(R.id.itemImgImageInfo);
167             Bitmap bm = MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(), Long.parseLong((String)mList.get(position).get(imageID)), Images.Thumbnails.MICRO_KIND, null);
168             image.setImageBitmap(bm);
169             
170             return convertView;
171         }
172     }
173 }

下面是模拟器上的效果:

由于是初学java和android,代码写得比较糙,请见谅,欢迎指正,不胜感激。

转载于:https://www.cnblogs.com/freeliver54/archive/2012/06/11/2544737.html

[转]Android开发,实现可多选的图片ListView,便于批量操作相关推荐

  1. android 最新 九宫格,Android开发中怎么显示一个九宫格图片

    Android开发中怎么显示一个九宫格图片 发布时间:2020-11-21 15:09:33 来源:亿速云 阅读:86 作者:Leah 本篇文章给大家分享的是有关Android开发中怎么显示一个九宫格 ...

  2. MVC、MVP、MVVM:谁才是Android开发的终极之选?

    概述 MVC.MVP.MVVM 都是在 Android 开发中经常用到的架构思想,它们都是为了更好地分离代码.提高代码可复用性.方便维护等目的而设计的.下面对这三种架构思想进行简单的介绍和比较. MV ...

  3. Android开发笔记(九十七)图片的特效处理

    图片特效用到的函数 本文讲述的图片特效处理包括:怀旧.光照.光晕.底片.浮雕.模糊.锐化.黑白.冰冻.素描,所有这些特效都是基于一定的算法,对图像每个点的RGB值进行计算,并汇总所有点的计算结果生成新 ...

  4. Android开发笔记(九十四)图片的基本加工

    位图管理Bitmap Android上的图形使用Drawable类,而位图管理则使用Bitmap类,java上与之对应的是awt包中的BufferedImage.Android开发中有需要对jpg.p ...

  5. Android开发笔记(七十七)图片缓存算法

    ImageCache 由于手机流量有限,又要加快app的运行效率,因此好的app都有做图片缓存.图片缓存说起来简单,做起来就用到很多知识点,可算是集Android技术之大全了.只要理解图片缓存的算法, ...

  6. Android开发之使用GridView+仿微信图片上传功能(附源代码)

    前言:如果转载文章请声明转载自:https://i.cnblogs.com/EditPosts.aspx?postid=7419021  .另外针对有些网站转载本人的文章结果源码链接不对的问题,本人在 ...

  7. Android开发之使用Handler封装下载图片工具类(源代码分享)

    如果每下载一张图片,就得重写一次Http协议,多线程的启动和handler的信息传递就显得太麻烦了,我们直接来封装一个工具类,便于我们以后在开发时随时可以调用. (1)在清单文件添加权限 <us ...

  8. Android开发--Matrix(二)--实现图片的旋转

    Matrix功能很是强大,利用这个类提供的一系列方法,我们可以实现图片的旋转. 下面以一个例子说明实现方法. 首先,我们看下实现的截图: 下面给出具体的实现代码: 1.xml布局文件 <?xml ...

  9. android开发 之 Canvas绘制文字,图片

    一.Canvas的常用操作速查表 操作类型 相关API 备注 绘制颜色 drawColor, drawRGB, drawARGB 使用单一颜色填充整个画布 绘制基本形状 drawPoint, draw ...

最新文章

  1. 后端系统开发之白名单机制
  2. C语言学习之输出以下的杨辉三角形(要求输出10行);
  3. linux 设置mysql 数据库编码utf8
  4. (*长期更新)软考网络工程师学习笔记——Section 16 磁盘存储技术和网络规划设计
  5. java kryo register_java相关:Kryo框架使用方法代码示例
  6. 数据的存储特殊矩阵压缩存储【数据结构F】
  7. 计算机应用基础重点分析,计算机应用基础整体设计重点分析.doc
  8. 广东人大常委会党组会议强调:要加快人工智能等领域的相关立法工作。【Python】
  9. SSH中设置字符编码防止乱码
  10. eclipse 查看变量或方法被调用的快捷键
  11. List集合操作二:排序
  12. 【iOS-Cocos2d游戏开发之二十一 】自定义精灵类并为你的精灵设置***帧以及动画创建!【二】...
  13. ORACLE常用函数汇总
  14. 《游戏引擎架构》中英词汇索引表
  15. python椭圆花瓣_python之花瓣美女下载详解
  16. c语言摄氏度字符,c语言摄氏度与华氏温度如何转换
  17. Jenkins + 钉钉 + SpringBoot 极简入门,一键打包部署项目
  18. ssm框架前后端数据交互完整示例
  19. centsos7网络连接激活失败_CenOS 7初始安装后无网络的解决办法
  20. comsol—偏振光仿真

热门文章

  1. 如何解决在每次开机后运行lcm相关命令会提示需要配置IP的问题
  2. 利用JQuery jsonp实现Ajax跨域请求 .Net 的*.handler 和 WebService,返回json数据
  3. 机器学习中的无监督学习_无监督机器学习中聚类背后的直觉
  4. 为什么银行没有厕所?内急了怎么办!
  5. PHP(二)——HTML基础
  6. 《命犯桃花》离斯蒂芬·金还很遥远
  7. priority case语句
  8. DDR3 IP设计说明
  9. fedora 用安装 DVD 建立本地 yum 源
  10. NB-IoT SNR RSRQ RSRP等信号参数解释