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

本文转自: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个人信息安全影响评估指南_发布 | 网络安全标准实践指南—移动互联网应用程序(App)收集使用个人信息自评估指南...

关于发布《网络安全标准实践指南—移动互联网应用程序(App)收集使用个人信息自评估指南》的通知信安秘字[2020] 40号各有关单位&#xff1a;为落实《网络安全法》相关要求&#xff0c;围绕中央网信办、工信部、公安部、市场监管总局联合制定的《App违法违规收集使用个人信息行为…

在线生成 CSS3 的工具

1) CSS Creator – Layout Design 2) CSS Menu Maker 3) CSS3 Please 4) CSS3 Generator 5) CSS Border Radius 6) CSS3 Gradient Generator 7) CSS3 Button Generator 8 ) Mike Plate’s CSS3 Playground 9) Border Image Generator 10) CSS3 WRAP 11) Button Maker 12) Font…

python image 转成字节_就是这么牛!三行Python代码,让数据处理速度提高2到6倍

本文可以教你仅使用 3 行代码&#xff0c;大大加快数据预处理的速度。Python 是机器学习领域内的首选编程语言&#xff0c;它易于使用&#xff0c;也有很多出色的库来帮助你更快处理数据。但当我们面临大量数据时&#xff0c;一些问题就会显现……在默认情况下&#xff0c;Pyth…

第4章 Python 数字图像处理(DIP) - 频率域滤波5 - 二变量函数的傅里叶变换、图像中的混叠、二维离散傅里叶变换及其反变换

目录二变量函数的傅里叶变换二维冲激及其取样性质二维连续傅里叶变换对二维取样和二维取样定理图像中的混叠二维离散傅里叶变换及其反变换二变量函数的傅里叶变换 二维冲激及其取样性质 两个连续变量的冲激函数定义为&#xff1a; δ(t,z){1,tz00,others(4.52)\delta(t, z) …

QC4+充电协议_一文看懂各家充电协议!总算彻底理清了

五一小长假马上就要到了&#xff0c;虽说今年的五一小长假是一个长达5天的“Plus”版小长假&#xff0c;但是受到疫情的影响&#xff0c;大多数人还是选择了在家中度过这个假期。既然说到了宅在家里度过这个假期&#xff0c;那么很多人都会选择让手机来陪伴自己度过。虽然最近几…

类图 示例

神州六号飞船是神州飞船系统的一种&#xff0c;它由轨道舱、返回舱、推进舱和逃逸求生塔等组成&#xff1b;航天员可以在返回舱内驾驶飞船&#xff0c;轨道舱由是航天员工作和休息的场所。在紧急的情况下&#xff0c;可以利用逃逸求生塔逃生。在飞船两侧有多个太阳能电池翼&…

bat 命令返回结果_bat教程[284] unzip解压

古树屋Click to follow us(1)unzip命令的简介C:\Users\86137\Desktop>unzip -hUnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spieler. Sendbug reports using http://www.info-zip.org/zip-bug.html; see README for details.Usage: unzip [-Z] [-opts[mo…

Framework7:不会Objective-C,也能开发iOS7应用

摘要&#xff1a;Framework7是一款开源的轻量级HTML框架&#xff0c;用来创建混合或有着iOS7原生体验的Web应用。其包含HTML布局、所有基础界面、动画效果、视图以及简单的自定义样式&#xff0c;让你无需修炼Objective-C语言&#xff0c;就可以构建自己的iOS7应用。 Framework…

第4章 Python 数字图像处理(DIP) - 频率域滤波7 - 二维DFT和IDFT的一些性质 - 傅里叶频谱和相角

目录二维DFT和IDFT的一些性质傅里叶频谱和相角二维DFT和IDFT的一些性质 傅里叶频谱和相角 F(u,v)R(u,v)jI(u,v)∣F(u,v)∣ejϕ(u,v)(4.86)F(u, v) R(u, v) jI(u, v) |F(u, v)|e^{j\phi(u,v)} \tag{4.86}F(u,v)R(u,v)jI(u,v)∣F(u,v)∣ejϕ(u,v)(4.86) 幅度&#xff0c;称为…

第4章 Python 数字图像处理(DIP) - 频率域滤波8 - 二维DFT和IDFT的一些性质 - 二维离散卷积定理

目录二维DFT和IDFT的一些性质二维离散卷积定理二维离散傅里叶变换性质的小结二维DFT和IDFT的一些性质 二维离散卷积定理 二维循环卷积表达式&#xff1a; (f⋆h)(x,y)∑m0M−1∑n0N−1f(m,n)h(x−m,y−n)(4.94)(f \star h)(x, y) \sum_{m0}^{M-1} \sum_{n0}^{N-1} f(m,n)h(x…

jmeter中重定向多个正则表达式_2020年jmeter技术实战续集,最新技术全栈,值得收藏

在上一篇&#xff1a;主要介绍线程组、HTTP请求默认值、用户定义的变量、固定定时器的应用场景及实战。以下主要介绍正则表达式提取器、调式取样器(Debug Sampler)、响应断言、HTTP信息头管理器的应用场景及实战。一、正则表达式提取器1、使用场景从请求的响应结果中取到需要的…

[置顶] 均衡音效

[置顶] 均衡音效 1均衡的作用 均衡器是一种可以分别调节各种频率成分电信号放大量的电子设备&#xff0c;通过对各种不同频率的电信号的调节来补偿扬声器和声场的缺陷&#xff0c;补偿和修饰各种声源及其它特殊作用。具体来说&#xff0c;它的作用如下&#xff1a; &#xff08…

第4章 Python 数字图像处理(DIP) - 频率域滤波9 - 频率域滤波基础、频率域的滤波过程、低通、高通

目录频率域滤波基础频率域的其他特性频率域滤波基础知识频率域滤波步骤小结空间域和频率域滤波之间的对应关系频率域滤波基础 频率域的其他特性 频率域中的滤波过程如下&#xff1a; 首先修改傅里叶变换以在到特定目的然后计算IDFT&#xff0c;返回到空间域 # 频率域中的其…

C# :试玩EventLog

1. 专门创建Source的Log   创建了Source&#xff0c;log显示在 Event viewer/Applications and Services logs/ 自定义Source 中&#xff0c;待遇比较高&#xff0c;专门显示的。 创建Source需要管理员身份&#xff0c;否则Crash。 如果已经打开了 Computer Management,请关闭…

css 宋体_Java前端基础(一)之html/css

1.1 htmlHTML:超文本标记语言(Hyper Text Markup Language)&#xff0c;标准通用标记语言下的一个应用。HTML 不是一种编程语言&#xff0c;而是一种标记语言 (markup language)&#xff0c;是网页制作所必备的WEB开发工具&#xff1a;hbuilder/webstorm/vs code/eclpise最简单…

gpio的8种工作模式_Stm32之GPIO工作模式简介

GPIO的8种工作模式GPIO初始化结构体的时候&#xff0c;必须要配置合适的工作模式&#xff0c;这样才能使得IO口发挥应有的作用。工作模式大体上共分为输入输出两类&#xff0c;共8种&#xff0c;下面将介绍这8种工作模式。GPIO工作模式输入模式GPIO_Mode_AIN 模拟输入 GPIO_Mod…

vagrant,流浪汉,我又来啦。

最近学个DEVOPS2.0&#xff0c;讲微服务&#xff0c;容器华&#xff0c;持续部署&#xff0c;很到位&#xff0c;就一个一个工具撸一撸。。。 vagrant&#xff0c;以前接触过&#xff0c;所以上手快&#xff0c;&#xff0c;哈哈&#xff0c;&#xff0c;用时再具体配置。 virt…

dedecms最新版本修改任意管理员漏洞

此漏洞无视gpc转义&#xff0c;过80sec注入防御。 补充下&#xff0c;不用担心后台找不到。这只是一个demo&#xff0c;都能修改任意数据库了&#xff0c;还怕拿不到SHELL&#xff1f; 起因是全局变量$GLOBALS可以被任意修改&#xff0c;随便看了下&#xff0c;漏洞一堆&#x…

第4章 Python 数字图像处理(DIP) - 频率域滤波10 - 使用低通频率域滤波器平滑图像 - 理想、高斯、巴特沃斯低通滤波器

目录使用低通频率域滤波器平滑图像理想低通滤波器(ILPF)高斯低通滤波器(GLPF)巴特沃斯低通滤波器低通滤波的例子使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 在以原点为中心的一个圆内无衰减地通过所有频率&#xff0c;而在这个圆外“截止”所有的频率的二维低通滤波…

bluecam连接步骤说明_厂家详解旋片式真空泵使用说明

旋片式真空泵是有区分单双极高速直联结构的真空泵&#xff0c;是用来对密封容器抽除气体的基本设备之一。旋片式真空泵的泵与电机连轴&#xff0c;有着高转速、外型小、结构紧凑、流动性工作方便的优点。本文所使用旋片式真空泵使用说明资料&#xff0c;是台冠真空泵技术团队工…