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

来源:互联网 发布:sql中distinct是啥意思 编辑:程序博客网 时间:2024/05/17 04:55
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         @Override118         public int getCount() {119             return mList.size();120         }121 122         @Override123         public Object getItem(int position) {124             return position;125         }126 127         @Override128         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         @Override153         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 }下面是模拟器上的效果: 


原创粉丝点击