本文轉自: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?<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>
?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?}
??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,代碼寫得比較糙,請見諒,歡迎指正,不勝感激。
?
?