[轉]Android開發,實現可多選的圖片ListView,便于批量操作

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

?

?

轉載于:https://www.cnblogs.com/freeliver54/archive/2012/06/11/2544737.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260734.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260734.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260734.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

個人信息安全影響評估指南_發布 | 網絡安全標準實踐指南—移動互聯網應用程序(App)收集使用個人信息自評估指南...

關于發布《網絡安全標準實踐指南—移動互聯網應用程序(App)收集使用個人信息自評估指南》的通知信安秘字[2020] 40號各有關單位&#xff1a;為落實《網絡安全法》相關要求&#xff0c;圍繞中央網信辦、工信部、公安部、市場監管總局聯合制定的《App違法違規收集使用個人信息行為…

Go的50度灰:Golang新開發者要注意的陷阱和常見錯誤

Go的50度灰&#xff1a;Golang新開發者要注意的陷阱和常見錯誤 http://colobu.com/2015/09/07/gotchas-and-common-mistakes-in-go-golang/

android intent和intent action大全

不管是頁面牽轉&#xff0c;還是傳遞數據&#xff0c;或是調用外部程序&#xff0c;系統功能都要用到intent。 在做了一些intent的例子之后&#xff0c;整理了一下intent&#xff0c;希望對大家有用。 由于intent內容太多&#xff0c;不可能真的寫全&#xff0c;難免會有遺落&a…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波4 - 單變量的離散傅里葉變換DFT

目錄標題單變量的離散傅里葉變換由取樣后的函數的連續變換得到DFT取樣和頻率間隔的關系單變量的離散傅里葉變換 由取樣后的函數的連續變換得到DFT 對原函數的變換取樣后的業的發展的變換F~(μ)\tilde F(\mu)F~(μ)&#xff0c;但未給出取樣后的函數f~(t)\tilde f(t)f~?(t)的…

在線生成 CSS3 的工具

1) CSS Creator – Layout Design 2) CSS Menu Maker 3) CSS3 Please 4) CSS3 Generator 5) CSS Border Radius 6) CSS3 Gradient Generator 7) CSS3 Button Generator 8 ) Mike Plate’s CSS3 Playground 9) Border Image Generator 10) CSS3 WRAP 11) Button Maker 12) Font…

python image 轉成字節_就是這么牛!三行Python代碼,讓數據處理速度提高2到6倍

本文可以教你僅使用 3 行代碼&#xff0c;大大加快數據預處理的速度。Python 是機器學習領域內的首選編程語言&#xff0c;它易于使用&#xff0c;也有很多出色的庫來幫助你更快處理數據。但當我們面臨大量數據時&#xff0c;一些問題就會顯現……在默認情況下&#xff0c;Pyth…

sessionStorage 、localStorage 和 cookie 之間的區別(轉)

essionStorage 、localStorage 和 cookie 之間的區別(轉) 2012-05-08 14:29:19| 分類&#xff1a; HTML5CSS3WEBAPP|舉報|字號 訂閱 sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的&#xff0c;可以方便的在web請求之間保存數據。有了本地數據&#xff0c;…

刪除文件夾里的圖片,打印刪除日志

1 #region 僵尸文件夾中的文件如果不在活文件列表中&#xff0c;刪之2 List<string> deadfile new List<string>();3 foreach(string str in lstZombileDic)4 {5 if(Direct…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波5 - 二變量函數的傅里葉變換、圖像中的混疊、二維離散傅里葉變換及其反變換

目錄二變量函數的傅里葉變換二維沖激及其取樣性質二維連續傅里葉變換對二維取樣和二維取樣定理圖像中的混疊二維離散傅里葉變換及其反變換二變量函數的傅里葉變換 二維沖激及其取樣性質 兩個連續變量的沖激函數定義為&#xff1a; δ(t,z){1,tz00,others(4.52)\delta(t, z) …

巧用VC工程下的rc文件

巧用VC工程下的rc文件(發表時間: 2008-12-30 17:20:00) 【評論】 【打印】 【字體&#xff1a;大 中 小】 本文鏈接&#xff1a;http://blog.pfan.cn/miaowei/40117.html 復制鏈接 分享到&#xff1a; 0標簽:VC rc文件 資源文件 窗口尺寸設置 添加資源 縱觀真個的VC工程&a…

藍橋杯 參考題目 黃金隊列(水題)

黃金分割數0.618與美學有重要的關系。舞臺上報幕員所站的位置大約就是舞臺寬度的0.618處&#xff0c;墻上的畫像一般也掛在房間高度的0.618處&#xff0c;甚至股票的波動據說也能找到0.618的影子.... 黃金分割數是個無理數&#xff0c;也就是無法表示為兩個整數的比值。0.618只…

QC4+充電協議_一文看懂各家充電協議!總算徹底理清了

五一小長假馬上就要到了&#xff0c;雖說今年的五一小長假是一個長達5天的“Plus”版小長假&#xff0c;但是受到疫情的影響&#xff0c;大多數人還是選擇了在家中度過這個假期。既然說到了宅在家里度過這個假期&#xff0c;那么很多人都會選擇讓手機來陪伴自己度過。雖然最近幾…

vi編輯器選項

Vi編輯器有一些選項設置可以幫助人們更好的使用。 在vi中選項分為兩種: 1、 開關選項&#xff0c;如果要打開這類選項就使用ex命令——&#xff1a;set 選項&#xff1b;如果要關閉這類選項就是用ex命令——&#xff1a;set no選項&#xff08;注意no和選項之間沒有空格&…

javascript作用域容易記錯的兩個地方

1.function fun() { var a"rxm"; b"cwr"; } alert(a);//錯誤&#xff0c;a局部變量 alert(b); //"cwr",b全局變量。 2. var a"rxm"; function fun() { alert(a);var a"123"; alert(a); }fun();alert(a); 輸出結果&#xff1…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波6 - 二維DFT和IDFT的一些性質 - 平移和旋轉、周期性、對稱性

目錄二維DFT和IDFT的一些性質空間間隔和頻率間隔的關系平移和旋轉周期性對稱性二維DFT和IDFT的一些性質 空間間隔和頻率間隔的關系 Δu1MΔT(4.69)\Delta u \frac{1}{M \Delta T} \tag{4.69}ΔuMΔT1?(4.69) Δv1NΔZ(4.70)\Delta v \frac{1}{N \Delta Z} \tag{4.70}ΔvNΔ…

類圖 示例

神州六號飛船是神州飛船系統的一種&#xff0c;它由軌道艙、返回艙、推進艙和逃逸求生塔等組成&#xff1b;航天員可以在返回艙內駕駛飛船&#xff0c;軌道艙由是航天員工作和休息的場所。在緊急的情況下&#xff0c;可以利用逃逸求生塔逃生。在飛船兩側有多個太陽能電池翼&…

bat 命令返回結果_bat教程[284] unzip解壓

古樹屋Click to follow us(1)unzip命令的簡介C:\Users\86137\Desktop>unzip -hUnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spieler. Sendbug reports using http://www.info-zip.org/zip-bug.html; see README for details.Usage: unzip [-Z] [-opts[mo…

K/3 MRP運算數據不準的原因及解決方案

系統MRP計算的結果不正確, 經過分析系統的數據&#xff0c;把MRP計算不正確原因整理如下:1.系統中存在大量的生產任務單沒有完全領料&#xff0c;但被結案&#xff0c;造成部份領料單竄單領料&#xff0c;最終引起已分配量不正確2.系統中存在大量的手工錄入的生產領料單3.存在部…

解壓版本的tomcat服務安裝

以下適合各個版本的tomcat&#xff08;注意啟動時8080端口要確保未被占用&#xff09; 今天搭一個Tomcat服務器,為了方便決定將解壓版&#xff08;非windows的安裝方式&#xff09;的tomcat添加為一個windows服務。 環境&#xff1a; JDK 1.5.0_06 Tomcat-5.5.20 Windows2003 瑞…

Framework7:不會Objective-C,也能開發iOS7應用

摘要&#xff1a;Framework7是一款開源的輕量級HTML框架&#xff0c;用來創建混合或有著iOS7原生體驗的Web應用。其包含HTML布局、所有基礎界面、動畫效果、視圖以及簡單的自定義樣式&#xff0c;讓你無需修煉Objective-C語言&#xff0c;就可以構建自己的iOS7應用。 Framework…