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 }下面是模拟器上的效果: