最早的時(shí)候我下過(guò)一個(gè)2005EE版,怎么也安裝不上,后來(lái)發(fā)現(xiàn)原來(lái)是EE不支持xp =_= , 然后就下 .... 本機(jī)沒(méi)有安裝過(guò)消息隊(duì)列,找出系統(tǒng)盤(pán)安裝消息隊(duì)列組件,在組件安裝中
創(chuàng)新互聯(lián)是一家專(zhuān)注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),通道網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:通道等地區(qū)。通道做網(wǎng)站價(jià)格咨詢:18982081108
[img]可以和ArrayList實(shí)現(xiàn)對(duì)比下 Android之ArrayList
ArrayList 實(shí)現(xiàn)多了一個(gè)AccessRondom 接口,少了Deque 接口
LinkList 實(shí)現(xiàn)多了Deque接口,少了AccessRandom接口
想了解AccessRandom接口可以參看 AccessRandom接口有啥用
Deque接口顧名思義,隊(duì)列,說(shuō)明LinkList 支持隊(duì)列操作
來(lái)看看內(nèi)部屬性
官方文檔對(duì)LinkList 的解釋是雙向鏈表,那么很容易理解這里保留first ,last 指針的意義了,就是為了方便雙向遍歷和插入
本身添刪改查沒(méi)有太多要說(shuō),注意下按索引遍歷,先是算下inde與size /2 比較下,然后決定是從頭部開(kāi)始遍歷還是尾部開(kāi)始遍歷。
主要就是有一個(gè)線程隊(duì)列,維護(hù)這些任務(wù),這里沒(méi)有用到Queue而是用List是考慮到顯示的問(wèn)題。
final void removeMessages(int what)
Remove any pending posts of messages with code 'what' that are in the message queue.
這個(gè)是我看API里面的一個(gè)方法??唇忉?xiě)?yīng)該是異常指定標(biāo)識(shí)what對(duì)應(yīng)的那個(gè)消息msg。。希望對(duì)你有幫助
下面和大家分享一下android中非常重要的消息處理機(jī)制,說(shuō)到消息處理,Message,MessageQueue,Looper,Handler這四個(gè)類(lèi)的作用是我們必須要明白的。 下面分別談?wù)勊麄兊淖饔茫?MessageQueue MessageQueue表示消息隊(duì)列,存放消息的地方,按照“先進(jìn)先..則執(zhí)行,每一個(gè)線程只可以擁有一個(gè)MessageQueue。當(dāng)創(chuàng)建Looper對(duì)象的時(shí)候會(huì)創(chuàng)建一個(gè)MessageQueue對(duì)象。
Message
Message表示消息對(duì)象,MessageQueue中存放的對(duì)象,一個(gè)MessageQueue中可以存放多個(gè)Message對(duì)象。通過(guò)調(diào)用Message類(lèi)的obtain()方法或者調(diào)用Handler類(lèi)的obtainMessage()方法獲取Message對(duì)象,但是這樣并不一定會(huì)創(chuàng)建一個(gè)新的Message對(duì)象,如果消息池中有可用的Message對(duì)象則直接取出返回這個(gè)對(duì)象,否則如果消息池中沒(méi)有可用的Message對(duì)象,則會(huì)創(chuàng)建一個(gè)新的Message對(duì)象。當(dāng)消息隊(duì)列中的Message對(duì)象被系統(tǒng)處理完之后,該Message對(duì)象會(huì)從MessageQueue中刪除,然后放入消息池中。
Looper
Looper是用來(lái)操作MessageQueue的,每一個(gè)Looper對(duì)應(yīng)一個(gè)MessageQueue,可以通過(guò)調(diào)用Looper.myLooper()方法獲取當(dāng)前線程的Looper對(duì)象,Looper循環(huán)從MessageQueue中取出Message對(duì)象,交給Handler調(diào)用handleMessage方法進(jìn)行處理,處理完之后Message對(duì)象被放入消息池中。
Handler
Handler是消息的處理者,Handler將需要傳遞的信息封裝成Message對(duì)象,然后調(diào)用sendMessage方法將Message放入MessageQueue中,當(dāng)MessageQueue循環(huán)到該Message時(shí),調(diào)用相應(yīng)Handler對(duì)象的handleMessage方法對(duì)其進(jìn)行處理。
注意在UI線程也就是主線程中默認(rèn)會(huì)創(chuàng)建Looper對(duì)象和MessageQueue對(duì)象,如果在我們自己新開(kāi)的線程中要進(jìn)行消息處理,必須創(chuàng)建Looper對(duì)象和MessageQueue對(duì)象,通過(guò)調(diào)用Looper.prepare()方法可以創(chuàng)建Looper對(duì)象和MessageQueue對(duì)象,調(diào)用Looper.loop()方法可以啟動(dòng)消息循環(huán)隊(duì)列。
先是兩個(gè)layout:
1、main.xml
復(fù)制代碼
復(fù)制代碼
1 ?xml version="1.0" encoding="utf-8"?
2 LinearLayout xmlns: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
復(fù)制代碼
復(fù)制代碼
2、listitem.xml
復(fù)制代碼
復(fù)制代碼
1 ?xml version="1.0" encoding="utf-8"?
2 LinearLayout xmlns: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=""
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
復(fù)制代碼
復(fù)制代碼
接著是代碼:
復(fù)制代碼
復(fù)制代碼
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 ArrayListString fileNames = new ArrayListString();
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 ArrayListMapString, String GetImageList(){
69
70 ArrayListMapString, String imageList = new ArrayListMapString,String();
71 HashMapString, 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 HashMapString, 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 MapInteger, Boolean map;
101 private ListInteger state;
102 private List? extends MapString, ? mList;
103
104 LayoutInflater mInflater;
105
106 public MultipleChoiceImageListAdapter(Context context, ListMapString, String data, int resource, String[] from, int[] to) {
107 super(context, data, resource, from, to);
108 map = new HashMapInteger, 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 ArrayListInteger();
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 //設(shè)置條目選中狀態(tài)
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 }