ExpandableListView是android中可以實現下拉list的一個控件,是一個垂直滾動的心事兩個級別列表項手風琴試圖,列表項是來自ExpandableListViewaAdapter,組可以單獨展開。
重要方法:
1
2
3
4
5
6
7
8
9
10
11
12
|
expandGroup
( int
groupPos) ; //在分組列表視圖中
展開一組, setSelectedGroup
( int
groupPosition) ; //設置選擇指定的組。 setSelectedChild
( int
groupPosition, int
childPosition, boolean
shouldExpandGroup); //設置選擇指定的子項。 getPackedPositionGroup
( long
packedPosition); //返回所選擇的組 getPackedPositionForChild
( int
groupPosition, int
childPosition) ; //返回所選擇的子項 getPackedPositionType
( long
packedPosition); //返回所選擇項的類型(Child,Group) isGroupExpanded
( int
groupPosition); //判斷此組是否展開 |
expandableListView.setDivider();這個是設定每個Group之間的分割線。
expandableListView.setGroupIndicator();這個是設定每個Group之前的那個圖標。
expandableListView.collapseGroup(int group); 將第group組收起
ExpandableListAdapter
一個接口,將基礎數據鏈接到一個ExpandableListView。 此接口的實施將提供訪問Child的數據(由組分類),並實例化的Child和Group。
1.重要方法
getChildId (int groupPosition, int childPosition) 獲取與在給定組給予孩子相關的數據。
getChildrenCount (int groupPosition) 返回在指定Group的Child數目。
案例:
首先定義個一個佈局文件expandablelistview.xml
1
2
3
4
5
6
7
8
9
10
11
12
|
<? xml
version = "1.0"
encoding = "utf-8" ?> < LinearLayout
xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:orientation = "vertical"
> < ExpandableListView android:id
= "@+id/expandableListView" android:layout_width
= "fill_parent" android:layout_height
= "wrap_content" > </ ExpandableListView > </ LinearLayout > |
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
package
com.test; import
java.util.ArrayList; import
java.util.List; import
javax.security.auth.PrivateCredentialPermission; import
android.app.Activity; import
android.os.Bundle; import
android.view.Gravity; import
android.view.View; import
android.view.ViewGroup; import
android.view.Window; import
android.widget.AbsListView; import
android.widget.BaseExpandableListAdapter; import
android.widget.ExpandableListView; import
android.widget.TextView; public
class
ExpandableListViewDemo extends
Activity { /**
Called when the activity is first created. */ //定義兩個List用來控制Group和Child中的String; private
List<String> groupArray; //組列表 private
List<List<String>> childArray; //子列表 private
ExpandableListView expandableListView_one; @Override public
void
onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); //
requestWindowFeature(Window.FEATURE_NO_TITLE); //設置爲無標題 setContentView(R.layout.expandablelistview); expandableListView_one
=(ExpandableListView)findViewById(R.id.expandableListView); groupArray
= new
ArrayList<String>(); childArray
= new
ArrayList<List<String>>(); /*-第一季-*/ initdate(); expandableListView_one.setAdapter( new
ExpandableListViewaAdapter(ExpandableListViewDemo. this )); /*-第二季-*/ //
groupArray.add("移動開發"); //
List<String> arrayList = new ArrayList<String>(); //
arrayList.add("Android"); //
arrayList.add("IOS"); //
arrayList.add("Windows Phone"); //
//組循環 //
for(int index=0;index<groupArray.size();++index) //
{ //
childArray.add(arrayList); //
} //
expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this)); } class
ExpandableListViewaAdapter extends
BaseExpandableListAdapter { Activity
activity; public
ExpandableListViewaAdapter(Activity a) {
activity
= a; }
/*-----------------Child
*/ @Override public
Object getChild( int
groupPosition, int
childPosition) { //
TODO Auto-generated method stub return
childArray.get(groupPosition).get(childPosition); } @Override public
long
getChildId( int
groupPosition, int
childPosition) { //
TODO Auto-generated method stub return
childPosition; } @Override public
View getChildView( int
groupPosition, int
childPosition, boolean
isLastChild, View convertView, ViewGroup parent) { String
string =childArray.get(groupPosition).get(childPosition); return
getGenericView(string); } @Override public
int
getChildrenCount( int
groupPosition) { //
TODO Auto-generated method stub return
childArray.get(groupPosition).size(); } /*
----------------------------Group */ @Override public
Object getGroup( int
groupPosition) { //
TODO Auto-generated method stub return
getGroup(groupPosition); } @Override public
int
getGroupCount() { //
TODO Auto-generated method stub return
groupArray.size(); } @Override public
long
getGroupId( int
groupPosition) { //
TODO Auto-generated method stub return
groupPosition; } @Override public
View getGroupView( int
groupPosition, boolean
isExpanded, View
convertView, ViewGroup parent) { String
string=groupArray.get(groupPosition); return
getGenericView(string); } @Override public
boolean
hasStableIds() { //
TODO Auto-generated method stub return
false ; } @Override public
boolean
isChildSelectable( int
groupPosition, int
childPosition) { //
TODO Auto-generated method stub return
true ; } private
TextView getGenericView(String string ) { AbsListView.LayoutParams
layoutParams = new
AbsListView.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); TextView
textView = new
TextView(activity); textView.setLayoutParams(layoutParams); textView.setGravity(Gravity.CENTER_VERTICAL
|Gravity.LEFT); textView.setPadding( 40 ,
0 ,
0 ,
0 ); textView.setText(string); return
textView; } } private
void
initdate() { addInfo( "語言" ,
new
String[]{ "Oracle" , "Java" , "Linux" , "Jquery" }); addInfo( "男人的需求" ,
new
String[]{ "金錢" , "事業" , "權力" , "女人" , "房子" , "車" , "球" }); } private
void
addInfo(String group,String []child) { groupArray.add(group); List<String>
childItem = new
ArrayList<String>(); for ( int
index= 0 ;index<child.length;index++) { childItem.add(child[index]); } childArray.add(childItem); } } |
運行效果:
註釋修改如下代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/*-第一季-*/ //
initdate(); //
expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this)); /*-第二季-*/ groupArray.add( "移動開發" ); List<String>
arrayList = new
ArrayList<String>(); arrayList.add( "Android" ); arrayList.add( "IOS" ); arrayList.add( "Windows
Phone" ); //組循環 for ( int
index= 0 ;index<groupArray.size();++index) { childArray.add(arrayList); } expandableListView_one.setAdapter( new
ExpandableListViewaAdapter(ExpandableListViewDemo. this )); |
運行效果:
★★★★★★★★★★★★★★★★★★★★
案例二:
1.定義一個主界面expandablelistview.xml
1
2
3
4
5
6
7
8
9
10
11
12
|
<?xml
version= "1.0"
encoding= "utf-8" ?> <LinearLayout
xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "fill_parent" android:layout_height= "fill_parent" android:orientation= "vertical"
> <ExpandableListView
android:id
= "@+id/expandableListView" android:layout_width
= "fill_parent" android:layout_height
= "wrap_content" > </ExpandableListView> </LinearLayout> |
2.在res/drawable目錄下創建樣式文件expandablelistview_groups.xml該界面是組界面:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<? xml
version = "1.0"
encoding = "utf-8" ?> < LinearLayout
xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:orientation = "vertical"
> < TextView android:id = "@+id/textGroup" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:paddingLeft = "40px" android:paddingTop = "6px" android:paddingBottom = "6px" android:textSize = "15sp" android:text = "No
data" >
</ TextView > </ LinearLayout > |
3.在res/drawable目錄下創建樣式文件expandablelistview_child.xml;是子控件,直接顯示列表內容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<? xml
version = "1.0"
encoding = "utf-8" ?> < LinearLayout
xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:orientation = "vertical"
> < TextView android:id = "@+id/textChild" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:paddingLeft = "60px" android:paddingTop = "10px" android:paddingBottom = "10px" android:textSize = "20sp" android:text = "No
Data"
/> </ LinearLayout > |
定義java文件:ExpandableListViewDemo_two.java
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
package
com.test; import
java.util.ArrayList; import
java.util.HashMap; import
java.util.List; import
java.util.Map; import
javax.security.auth.PrivateCredentialPermission; import
com.test.R; import
com.test.ExpandableListViewDemo.ExpandableListViewaAdapter; import
com.test.R.id; import
com.test.R.layout; import
android.app.Activity; import
android.os.Bundle; import
android.view.Gravity; import
android.view.View; import
android.view.ViewGroup; import
android.view.Window; import
android.widget.AbsListView; import
android.widget.BaseExpandableListAdapter; import
android.widget.ExpandableListView; import
android.widget.SimpleExpandableListAdapter; import
android.widget.TextView; public
class
ExpandableListViewDemo_two extends
Activity { /**
Called when the activity is first created. */ private
ExpandableListView expandableListView_one; @Override public
void
onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.expandablelistview);
expandableListView_one
=(ExpandableListView)findViewById(R.id.expandableListView); //創建二個一級條目標題
Map<String,
String> title_1 = new
HashMap<String, String>(); Map<String,
String> title_2 = new
HashMap<String, String>(); title_1.put( "group" ,
"移動開發" );
title_2.put( "group" ,
"男人的需求" );
//創建一級條目容器
List<Map<String,
String>> gruops = new
ArrayList<Map<String,String>>(); gruops.add(title_1);
gruops.add(title_2);
//創建二級條目內容
//內容一
Map<String,
String> content_1 = new
HashMap<String, String>(); Map<String,
String> content_2 = new
HashMap<String, String>(); content_1.put( "child" ,
"ANDROID" );
content_2.put( "child" ,
"IOS" );
List<Map<String,
String>> childs_1 = new
ArrayList<Map<String,String>>(); childs_1.add(content_1);
childs_1.add(content_2);
//內容二
Map<String,
String> content_3 = new
HashMap<String, String>(); Map<String,
String> content_4 = new
HashMap<String, String>(); Map<String,
String> content_5 = new
HashMap<String, String>(); content_3.put( "child" ,
"金錢" );
content_4.put( "child" ,
"權力" );
content_5.put( "child" ,
"女人" );
List<Map<String,
String>> childs_2 = new
ArrayList<Map<String,String>>(); childs_2.add(content_3);
childs_2.add(content_4);
childs_2.add(content_5);
//存放兩個內容,
以便顯示在列表中 List<List<Map<String,
String>>> childs = new
ArrayList<List<Map<String,String>>>(); childs.add(childs_1);
childs.add(childs_2);
//創建ExpandableList的Adapter容器
/**
*
使用SimpleExpandableListAdapter顯示ExpandableListView *
參數 1 .上下文對象Context
*
參數 2 .一級條目目錄集合
*
參數 3 .一級條目對應的佈局文件 (expandablelistview_groups.xml文件
*
參數 4 .fromto,就是map中的key,指定要顯示的對象
*
參數 5 .與參數 4 對應,指定要顯示在groups中的id
*
參數 6 .二級條目目錄集合
*
參數 7 .二級條目對應的佈局文件
*
參數 9 .與參數 8 對應,指定要顯示在childs中的id
/
SimpleExpandableListAdapter adapter = new
SimpleExpandableListAdapter( this ,
gruops, R.drawable.expandablelistview_groups, new
String[]{ "group" },
new
int []{R.id.textGroup},
childs,
R.drawable.expandablelistview_child, new
String[]{ "child" },
new
int []{R.id.textChild}
);
//加入列表
expandableListView_one.setAdapter(adapter);
expandableListView_one.setOnChildClickListener(listener); }
private
OnChildClickListener listener = new
OnChildClickListener() { @Override public
boolean
onChildClick(ExpandableListView parent, View v, int
groupPosition, int
childPosition, long
id) { //
TODO Auto-generated method stub toast( "點擊了" ); return
false ; } }; private
void
toast(String str) { Toast.makeText( this ,
str, Toast.LENGTH_LONG).show(); }
} |
上面的樣式也可以使用系統的自帶的樣式如下:
android.R.layout.simple_expandable_list_item_1,//層顯示樣式 ,系統自定義
android.R.layout.simple_expandable_list_item_2,
運行效果:
案例三:如果group中有個ImageVIew將會是什麼情況呢?
在SimpleExpandableListAdapter中有如下方法:
1
2
3
4
5
6
7
8
9
10
|
private
void
bindView(View view, Map<String, ?> data, String[] from, int []
to) { int
len = to.length; for
( int
i = 0 ;
i < len; i++) { TextView
v = (TextView)view.findViewById(to[i]); if
(v != null )
{ v.setText((String)data.get(from[i])); } } } |
從上面的方法中可以看出 SimpleExpandableListAdapter把所以的View都當成TextView來處理了,而不像SimpleAdapter可以自動判斷View的類型,自動綁定,解決版本就是重寫bingview回調一下試試:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public
class
MyExpandableListAdapter extends
BaseExpandableListAdapter{ private
void
bindView(View view, Map<String, ?> data, String[] from, int []
to) { int
len = to.length; boolean
isBound = false ; for
( int
i = 0 ;
i < len; i++) { final
View v = view.findViewById(to[i]); if
(v!= null )
{ final
Object _data = data.get(from[i]); String
text = _data == null
? ""
: data.toString(); if
(text == null )
{ text
= "" ; } if
(mViewBinder != null )
{ //如果Binder不爲空,使用Binder進行處理 isBound
= mViewBinder.setViewValue(v, data.get(from[i]), text); } if
(!isBound) { //如果Binder跳過,使用原來的方法進行處理 TextView
_v = (TextView)v; _v.setText((String)data.get(from[i])); }
} } } } |