在J2EE中提供過一種非常好的框架--MVC框架,實現原理:數據模型M(Model)存放數據,利用控制器C(Controller)將數據顯示在視圖V(View)上。在Android中有這樣一種高級控件,他的實現過程就類似於MVC框架。之所以稱它高級,是因為他的使用不像其他控件一樣,拖拽到界面上就能用,而是需要通過適配器將某些樣式的數據或控件添加到其上而使用,這樣的控件就是我們今天要說的AdapterView。
一:AdapterView-->V(視圖)
1:作用
以列表的形式顯示數據
2: 內容
AdapterView的內容一般是包含多項相同格式資源的列表
3:特點
(1)將前端顯示和后端數據分離
(2)內容不能通過ListView.add的形式添加列表項,需指定一個Adapter對象,通過它獲得顯示數據
(3)ListView相當於MVC框架中的V(視圖)
(4)Adapter相當於MVC框架中的C(控制器)
(5)數據源相當於MVC框架中的M(模型)
(6)超出屏幕顯示之后,自動加上滾動條
4:分類
(1)ListView:列表,其中只能含有一個控件TextView,
(2)Spinner:下拉列表,給用戶提供選擇
(3)Gallery:縮略圖,已經被水平的ScrollView和ViewPicker取代,但也還算常用,是一個可以把子項以中心鎖定,水平滾動的列表
(4)GridView:網格圖,以表格形式顯示資源,可以左右滑動的
5:事件
(1)用戶單擊列表項事件
◆為列表加載setOnItemClieckListener監聽,重寫onItemClick(發生單擊事件的列表對象ListView,被單擊控件對象view,在列表中的位置position,被單擊列表項的行ID)方法。
(2)用戶長按事件
◆為列表加載setOnItemLongClieckListener監聽,重寫onItemLongClick(發生單擊事件的列表對象ListView,被單擊控件對象view,在列表中的位置position,被單擊列表項的行ID)方法。
6:數據填充
借助下面的Adapter適配器對象從數據源中進行適配
二:Adapter-->C(控制器)
1:作用
把數據源中數據以某種樣式(xml文件)顯示在視圖中。
2:分類
(1)ArrayAdapter:他只能處理列表項內容全是文本的情況。
◆數據源:數組或者List<String>對象或者其他
(2)SimpleAdapter: 他不僅可以處理列表項全是文本的情況,當列表項中還有其他控件時,同樣可以處理。
◆數據源:只能為List<Map<“鍵”,“值”>>形式的數據
(3)自定義Adapter:根據xml文件中定義的樣式驚醒列表項的填充,適用性最強。
(4)SimpleCursorAdapter:專門用於把游標中的數據映像到列表中(我們以后再來研究)
3:自定義Adapter
(1)創建類,繼承自BaseAdapter
(2)重寫其中的四個方法
①int getCount():返回的是數據源對象的個數,即列表項數
②Object getItem(int position):返回指定位置position上的列表
③long getItemId(int position):返回指定位置處的行ID
④View getView():返回列表項對應的視圖,方法體中
◆實例化視圖填充器
◆用視圖填充器,根據Xml文件,實例化視圖
◆根據布局找到控件,並設置屬性
◆返回View視圖
三:數據填充
1:聲明AdapterView對象,根據ID利用findViewById方法找到此對象
2:聲明Adapter對象,根據構造方法實例化此對象。具體如下:
(1)ArrayAdapter<數據類型> adapter = new ArrayAdapter<數據類型>(context:一般指當前Activity對象,layout:每個列表項顯示的布局,data:數據源變量);
(2)SimpleAdapter adapter = new SimpleAdapter(context:一般指當前Activity對象,data:數據源變量,layout:每個列表項顯示的布局,new String[]{}:數據源中的“鍵”,new int[]{}:顯示數據源的控件ID);
(3)自定義Adapter類 adapter = new 自定義Adapter類構造方法;
3:綁定Adapter對象到Adapter上
AdapterView對象.setAdapter(Adapter對象);
四:具體應用
1:用ArrayAdapter填充ListView
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
public class MainActivity extends Activity {
private ListView lv;
private ArrayAdapter<String> adapter;
private String[] data = { "我是第1個列表項", "我是第2個列表項", "我是第3個列表項", "我是第4個列表項",
"我是第5個列表項", "我是第6個列表項", "我是第7個列表項" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.listView1);
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, data);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this,
"第" + (position + 1) + "項被單擊按下", Toast.LENGTH_LONG)
.show();
}
});
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this,
"第" + (position + 1) + "項被長時間按下", Toast.LENGTH_LONG)
.show();
return true;
}
});
}
}
|
|
結果:

2:用SimpleAdapter填充Spinner
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public
class
MainActivity
extends
Activity {
private
Spinner sp;
private
SimpleAdapter adapter;
private
String[] data = {
"我是第1個列表項"
,
"我是第2個列表項"
,
"我是第3個列表項"
,
"我是第4個列表項"
,
"我是第5個列表項"
,
"我是第6個列表項"
,
"我是第7個列表項"
,
"我是第8個列表項"
,
"我是第9個列表項"
};
ArrayList<Map<String, Object>> list =
new
ArrayList<Map<String, Object>>();
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sp = (Spinner) findViewById(R.id.spinner1);
Map<String, Object> map;
for
(
int
i =
0
; i < data.length; i++) {
map =
new
HashMap<String, Object>();
map.put(
"data"
, data[i]);
list.add(map);
}
adapter =
new
SimpleAdapter(
this
, list, R.layout.cell,
new
String[] {
"data"
},
new
int
[] { R.id.textView1 });
sp.setAdapter(adapter);
}
}
|
|
結果:

3:用SimpleAdapter填充GridView
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
public
class
MainActivity
extends
Activity {
private
GridView gv;
private
SimpleAdapter adapter;
private
int
imageids[] = { R.drawable.item1, R.drawable.item2,
R.drawable.item3, R.drawable.item4, R.drawable.item5,
R.drawable.item6, R.drawable.item7, R.drawable.item8,
R.drawable.item9, R.drawable.item10, R.drawable.item11,
R.drawable.item12, R.drawable.item13, R.drawable.item14,
R.drawable.item15 };
private
String data[] = {
"1"
,
"2"
,
"3"
,
"4"
,
"5"
,
"6"
,
"7"
,
"8"
,
"9"
,
"10"
,
"11"
,
"12"
,
"13"
,
"14"
,
"15"
};
private
List<Map<String, Object>> lists;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gv = (GridView) findViewById(R.id.gridView1);
lists =
new
ArrayList<Map<String, Object>>();
Map<String, Object> maps;
for
(
int
i =
0
; i < imageids.length; i++) {
maps =
new
Hashtable<String, Object>();
maps.put(
"image"
, imageids[i]);
maps.put(
"data"
, data[i]);
lists.add(maps);
}
adapter =
new
SimpleAdapter(
this
, lists, R.layout.cell,
new
String[] {
"image"
,
"data"
},
new
int
[] { R.id.imageView1, R.id.textView1 });
gv.setAdapter(adapter);
}
}
|
|
結果:

4:自定義AdapterView填充Gallery
◆自定義Adapter
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
public
class
MyAdapter
extends
BaseAdapter {
private
Context context;
private
int
imageids[];
public
MyAdapter(Context context,
int
imageids[]) {
this
.context = context;
this
.imageids = imageids;
}
@Override
public
int
getCount() {
return
imageids.length;
}
@Override
public
Object getItem(
int
position) {
return
imageids[position];
}
@Override
public
long
getItemId(
int
position) {
return
position;
}
@Override
public
View getView(
int
position, View convertView, ViewGroup parent) {
ImageView iv =
new
ImageView(context);
iv.setImageResource(imageids[position]);
iv.setLayoutParams(
new
Gallery.LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
return
iv;
}
}
|
|
◆主視圖
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public
class
MainActivity
extends
Activity {
private
Gallery gy;
private
MyAdapter adapter;
private
int
imageids[] = { R.drawable.w1,R.drawable.q1, R.drawable.q2, R.drawable.q3,
R.drawable.q4, R.drawable.q5, R.drawable.q6, R.drawable.q7, R.drawable.q8, R.drawable.q9 };
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gy = (Gallery) findViewById(R.id.gy);
adapter =
new
MyAdapter(
this
, imageids);
gy.setAdapter(adapter);
}
}
|
|
◆結果



本文轉自:http://cinderella7.blog.51cto.com/7607653/1281696