一,擴充卡. 顧名思義,就是把一些資料給弄得适當,适合以便于在View上顯示。可以看作是
界面資料綁定的一種了解。它所操縱的資料一般都是一些比較複雜的資料,如數組,連結清單,資料庫,集合等。擴充卡就像顯示器,把複雜的東西按人可以接受的方式來展現。那麼擴充卡是怎麼處理得到的資料,并把它顯示出來的呢。其實很簡單,說白了擴充卡它也是一個類,在類裡面它實作了父類的這幾個方法:
publicint getCount() //得到資料的行數
public Object getItem(int position)//根據position得到某一行的記錄
public long getItemId(int position)//得到某一條記錄的ID
//下面這個方法是最重要的相比于其它幾個方法,它顯式的定義了,擴充卡将要以什麼樣的方式去顯示我們所填充的資料,在自定義的擴充卡裡面我們通常會給它寫個布局檔案
publicView getView(int position, View convertView, ViewGroup parent)
我們常用的擴充卡一共有三個,當然不包含自定義的擴充卡,哪三個 那就是ArrayAdapter,SimpleAdapter,SimpleCursorAdapter 這三個,他們都是繼承BaseAdapter
其中以ArrayAdapter最為簡單,隻能展示一行字。SimpleAdapter有最好的擴充性,可以自定義出各種效果。SimpleCursorAdapter可以認為是SimpleAdapter對資料庫的簡單結合,可以方面的把資料庫的内容以清單的形式展示出來。
android提供的三種Adapter主要有ArrayAdapter,SimpleAdapter,SimpleCursorAdapter,ArraAdapter是簡單的字元串擴充卡,SimpleAdapter是可以自定義子View布局的,可以有圖檔(隻限于本地圖檔,如果要用網絡加載圖檔,請參考我之前的一篇Blog),SimpleCursorAdapter主要用于資料庫,前兩個的資料來源一般都是String[]或者List,後一個的資料來源一般是資料庫查詢得到的Cursor
而我們自定義用的最多的還是繼承自SimpleAdapter,下面說一下具體用法
我還是連着上一篇Blog,想做一個顯示帶下載下傳進度條的子View顯示于ListView中,SimpleAdapter可以顯示一般的圖檔,但是無法顯示進度條(因為不隻是要顯示,還要有實時更新),是以我們的做法是繼承SimpleAdapter,具體要複寫的方法有4個:
public int getCount()
public Object getItem(int position)
public long getItemId(int position)
public View getView(int position, View convertView, ViewGroup parent)
還有一個更重要的是其構造方法MyAdapter(Context context, List<Map<String, Object>> list),參數不是固定的,可以根據要用到的資料自己定義,第一個參數是要顯示的上下文環境,第二個參數是用來記錄各個條目的資訊
第一個方法主要是傳回ListView中要顯示的子View數量,也就是下載下傳任務數,隻要傳回構造方法中的list的條目就可以了
第二個方法是要傳回一個子View,即ListView中的一個子條目,當然你也可以自定義傳回你想要的資訊
第三個方法是根據ListView中的位置傳回id、
二,一般對于前兩個擴充卡,他們的資料來源無非就是String[]或者List 。下面我們列舉兩個例一子: 例一,數組作為資料源,填充的是ArrayAdapter public class Example extends ListActivity{
String[] sex = new String(){"男",“女”}//資料源
ArrayAdapter<String> adapter;//數組擴充卡,用的是泛型
public voidonCreate(Bundle SavedInstanceState){
super.onCreate(SavedInstanceStat);
//在對擴充卡初始化的時候,順便把資料源裝載到擴充卡裡, //this.android.R.Layout.Simple_List_Item_1這句話
//的意思是将資料源以系統定義好的樣式放到擴充卡裡.
adapter=newArrayAdapter<String(this.android.R.Layout.Simple_List_Item_1,sex);
this.setAdapter(adapter);//這是一個控件類,是以可以直接将擴充卡綁定到本身對象中。
}
}
例二:List作為資料源,填充的是SimpleAdapter
ListView list = (ListView)findViewById(R.id.MyListView);
//生成動态數組,并且轉載資料
ArrayList<HashMap<String, String>> mylist = newArrayList<HashMap<String, String>>();
for(int i=0;i<30;i++)
{
HashMap<String, String>map = new HashMap<String, String>();
map.put("ItemTitle","This is Title.....");
map.put("ItemText","This is text.....");
mylist.add(map);
}
//生成擴充卡,數組===》ListItem
SimpleAdapter mSchedule = new SimpleAdapter(this, //沒什麼解釋 mylist,//資料來源 R.layout.my_listitem,//ListItem的XML實作 //動态數組與ListItem對應的子項
new String[]{"ItemTitle", "ItemText"}, //ListItem的XML檔案裡面的兩個TextView ID new int[] {R.id.ItemTitle,R.id.ItemText});
//添加并且顯示
list.setAdapter(mSchedule);
}
三,應該說着兩個例子都不難,都是一些我們經常見到的用法,那麼對于SimpleCursorAdapter又是怎麼用的呢,SimpleCursorAdapter一般主要用于資料庫,它的資料來源一般都是資料庫查詢得到的Cursor 我們來看下面的例子:
String uriString = “content://contacts/people/”;
Cursor myCursor =managedQuery(Uri.parse(uriString), null, null, null, null);
String[] fromColumns = new String[]{People.NUMBER, People.NAME};
int[] toLayoutIDs = new int[] {R.id.nameTextView, R.id.numberTextView};
SimpleCursorAdapter myAdapter;
myAdapter=newSimpleCursorAdapter(this,R.layout.simplecursorlayout,myCursor,fromColumns,
toLayoutIDs);//傳入目前的上下文、一個layout資源,一個遊标和兩個數組:一個包含使用的列
//的名字,另一個(相同大小)數組包含View中的資源ID,用于顯示相應列的數
據值。
myListView.setAdapter(myAdapter);
我們把一個遊标綁定到了ListView上,并使用自定義的layout顯示來顯示每一個Item。
四,下面我們來定義自己的擴充卡。
為什麼要定義自己的擴充卡呢,原因就在于,當我們想用一些其它的展現方式,或者是我們需要的,呈現方式,這是就得DIY了。
首先我們定義一個類讓它繼承自BaseAdapter,再讓它實作一裡面所說的那幾個方法。那麼這個自定義擴充卡就算好了。裡面的一些方法我在上面都介紹過了,在這就不在贅述了。
1
import
java.util.List;
2
import
java.util.Map;
3
4
import
android.content.Context;
5
import
android.view.LayoutInflater;
6
import
android.view.View;
7
import
android.view.ViewGroup;
8
import
android.widget.BaseAdapter;
9
import
android.widget.LinearLayout;
10
import
android.widget.ProgressBar;
11
import
android.widget.TextView;
12
13
public
class
MyAdapter
extends
BaseAdapter
14
{
15
private
Context context;
16
17
private
LayoutInflater layoutInflater;
18
19
private
List
<
Map
<
String, Object
>>
list;
20
21
//
構造方法,參數list傳遞的就是這一組資料的資訊
22
public
MyAdapter(Context context, List
<
Map
<
String, Object
>>
list)
23
{
24
this
.context
=
context;
25
26
layoutInflater
=
LayoutInflater.from(context);
27
28
this
.list
=
list;
29
}
30
31
//
得到總的數量
32
public
int
getCount()
33
{
34
//
TODO Auto-generated method stub
35
return
this
.list
!=
null
?
this
.list.size():
0
;
36
}
37
38
//
根據ListView位置傳回View
39
public
Object getItem(
int
position)
40
{
41
//
TODO Auto-generated method stub
42
return
this
.list.get(position);
43
}
44
45
//
根據ListView位置得到List中的ID
46
public
long
getItemId(
int
position)
47
{
48
//
TODO Auto-generated method stub
49
return
position;
50
}
51
52
//
根據位置得到View對象
53
public
View getView(
int
position, View convertView, ViewGroup parent)
54
{
55
if
(convertView
==
null
)
56
{
57
convertView
=
layoutInflater.inflate(R.layout.item,
null
);
58
}
59
60
//
得到條目中的子元件
61
TextView tv1
=
(TextView)convertView.findViewById(R.id.nameTextView);
62
ProgressBar pb
=
(ProgressBar)convertView.findViewById(R.id.sizeProgressBar);
63
TextView tv2
=
(TextView)convertView.findViewById(R.id.sizeTextView);
64
65
//
從list對象中為子元件指派
66
tv1.setText(list.get(position).get(
"
name
"
).toString());
67
pb.setProgress(Integer.parseInt(list.get(position).get(
"
size
"
).toString()));
68
tv2.setText(list.get(position).get(
"
size
"
).toString());
69
70
return
convertView;
71
}
72
}