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

之前项目需要实现一个可多选的图片列表,用户选中一到多张图片后,批量上传。但是网上有可多选普通列表的代码、也有单纯图片列表的代码,却没有两者合并的代码,只好自己实现一个。 
废话不说,直接上代码。
先是两个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,代码写得比较糙,请见谅,欢迎指正,不胜感激。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值