本文转自: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,代码写得比较糙,请见谅,欢迎指正,不胜感激。