下面看看继承BaseExpandableListAdapter的适配器:
01
02
03
04
05
06
07
08
09
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
<code><SPAN xmlns=</code><code>"http://www.w3.org/1999/xhtml"</code><code>></code><code>package</code> <code>com.xyz.expande;</code>
<code> </code>
<code>import</code> <code>java.util.List;</code>
<code>import</code> <code>android.app.AlertDialog;</code>
<code>import</code> <code>android.content.Context;</code>
<code>import</code> <code>android.view.LayoutInflater;</code>
<code>import</code> <code>android.view.View;</code>
<code>import</code> <code>android.view.ViewGroup;</code>
<code>import</code> <code>android.widget.BaseExpandableListAdapter;</code>
<code>import</code> <code>android.widget.ImageView;</code>
<code>import</code> <code>android.widget.TextView;</code>
<code>public</code> <code>class</code> <code>ExpandAdapter</code><code>extends</code> <code>BaseExpandableListAdapter {</code>
<code> </code><code>private</code> <code>Context mContext;</code>
<code> </code><code>private</code> <code>LayoutInflater mInflater =</code><code>null</code><code>;</code>
<code> </code><code>private</code> <code>String[] mGroupStrings =</code><code>null</code><code>;</code>
<code> </code><code>private</code> <code>List<List<Item>> mData =</code><code>null</code><code>;</code>
<code> </code><code>public</code> <code>ExpandAdapter(Context ctx, List<List<Item>> list) {</code>
<code> </code><code>mContext = ctx;</code>
<code> </code><code>mInflater = (LayoutInflater) mContext</code>
<code> </code><code>.getSystemService(Context.LAYOUT_INFLATER_SERVICE);</code>
<code> </code><code>mGroupStrings = mContext.getResources().getStringArray(R.array.groups);</code>
<code> </code><code>mData = list;</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>void</code> <code>setData(List<List<Item>> list) {</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>int</code> <code>getGroupCount() {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>return</code> <code>mData.size();</code>
<code> </code><code>public</code> <code>int</code> <code>getChildrenCount(</code><code>int</code> <code>groupPosition) {</code>
<code> </code><code>return</code> <code>mData.get(groupPosition).size();</code>
<code> </code><code>public</code> <code>List<Item> getGroup(</code><code>int</code> <code>groupPosition) {</code>
<code> </code><code>return</code> <code>mData.get(groupPosition);</code>
<code> </code><code>public</code> <code>Item getChild(</code><code>int</code> <code>groupPosition,</code><code>int</code> <code>childPosition) {</code>
<code> </code><code>return</code> <code>mData.get(groupPosition).get(childPosition);</code>
<code> </code><code>public</code> <code>long</code> <code>getGroupId(</code><code>int</code> <code>groupPosition) {</code>
<code> </code><code>return</code> <code>groupPosition;</code>
<code> </code><code>public</code> <code>long</code> <code>getChildId(</code><code>int</code> <code>groupPosition,</code><code>int</code> <code>childPosition) {</code>
<code> </code><code>return</code> <code>childPosition;</code>
<code> </code><code>public</code> <code>boolean</code> <code>hasStableIds() {</code>
<code> </code><code>return</code> <code>false</code><code>;</code>
<code> </code><code>public</code> <code>View getGroupView(</code><code>int</code> <code>groupPosition,</code><code>boolean</code> <code>isExpanded,</code>
<code> </code><code>View convertView, ViewGroup parent) {</code>
<code> </code><code>if</code> <code>(convertView ==</code><code>null</code><code>) {</code>
<code> </code><code>convertView = mInflater.inflate(R.layout.group_item_layout,</code><code>null</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>GroupViewHolder holder =</code><code>new</code> <code>GroupViewHolder();</code>
<code> </code><code>holder.mGroupName = (TextView) convertView</code>
<code> </code><code>.findViewById(R.id.group_name);</code>
<code> </code><code>holder.mGroupName.setText(mGroupStrings[groupPosition]);</code>
<code> </code><code>holder.mGroupCount = (TextView) convertView</code>
<code> </code><code>.findViewById(R.id.group_count);</code>
<code> </code><code>holder.mGroupCount.setText(</code><code>"["</code> <code>+ mData.get(groupPosition).size() +</code><code>"]"</code><code>);</code>
<code> </code><code>return</code> <code>convertView;</code>
<code> </code><code>public</code> <code>View getChildView(</code><code>int</code> <code>groupPosition,</code><code>int</code> <code>childPosition,</code>
<code> </code><code>boolean</code> <code>isLastChild, View convertView, ViewGroup parent) {</code>
<code> </code><code>convertView = mInflater.inflate(R.layout.child_item_layout,</code><code>null</code><code>);</code>
<code> </code><code>ChildViewHolder holder =</code><code>new</code> <code>ChildViewHolder();</code>
<code> </code><code>holder.mIcon = (ImageView) convertView.findViewById(R.id.img);</code>
<code> </code><code>holder.mIcon.setBackgroundResource(getChild(groupPosition,</code>
<code> </code><code>childPosition).getImageId());</code>
<code> </code><code>holder.mChildName = (TextView) convertView.findViewById(R.id.item_name);</code>
<code> </code><code>holder.mChildName.setText(getChild(groupPosition, childPosition)</code>
<code> </code><code>.getName());</code>
<code> </code><code>holder.mDetail = (TextView) convertView.findViewById(R.id.item_detail);</code>
<code> </code><code>holder.mDetail.setText(getChild(groupPosition, childPosition)</code>
<code> </code><code>.getDetail());</code>
<code> </code><code>public</code> <code>boolean</code> <code>isChildSelectable(</code><code>int</code> <code>groupPosition,</code><code>int</code> <code>childPosition) {</code>
<code> </code><code><SPAN style=</code><code>"COLOR: #cc0000"</code><code>></code><code>/*很重要:实现ChildView点击事件,必须返回true*/</code>
<code></SPAN> </code><code>return</code> <code>true</code><code>;</code>
<code> </code><code>private</code> <code>class</code> <code>GroupViewHolder {</code>
<code> </code><code>TextView mGroupName;</code>
<code> </code><code>TextView mGroupCount;</code>
<code> </code><code>private</code> <code>class</code> <code>ChildViewHolder {</code>
<code> </code><code>ImageView mIcon;</code>
<code> </code><code>TextView mChildName;</code>
<code></LinearLayout></SPAN></SPAN></code>
TextView mDetail;
}
}
</SPAN>[/mw_shl_code]
里面用到的有两个布局,GroupView(子list没展开的view)如图:
<IGNORE_JS_OP>
1354586842_7926.png (28.18 KB, 下载次数: 3)
2012-12-4 17:17 上传
布局group_item_layout.xml如下:
<code><SPAN xmlns=</code><code>"http://www.w3.org/1999/xhtml"</code><code>><SPAN xmlns=</code><code>"http://www.w3.org/1999/xhtml"</code><code>><?xml version=</code><code>"1.0"</code> <code>encoding=</code><code>"utf-8"</code><code>?></code>
<code><LinearLayout xmlns:android=</code><code>"http://schemas.android.com/apk/res/android"</code>
<code> </code><code>android:layout_width=</code><code>"match_parent"</code>
<code> </code><code>android:layout_height=</code><code>"?android:attr/listPreferredItemHeight"</code>
<code> </code><code>android:orientation=</code><code>"horizontal"</code> <code>></code>
<code> </code><code><TextView</code>
<code> </code><code>android:id=</code><code>"@+id/group_name"</code>
<code> </code><code>android:layout_width=</code><code>"wrap_content"</code>
<code> </code><code>android:layout_height=</code><code>"?android:attr/listPreferredItemHeight"</code>
<code> </code><code>android:textAppearance=</code><code>"?android:attr/textAppearanceMedium"</code>
<code> </code><code>android:layout_marginLeft=</code><code>"35dip"</code>
<code> </code><code>android:gravity=</code><code>"center_vertical"</code>
<code> </code><code>android:singleLine=</code><code>"true"</code> <code>/></code>
<code> </code><code>android:id=</code><code>"@+id/group_count"</code>
<code> </code><code>android:layout_marginLeft=</code><code>"5dip"</code>
<code> </code><code>android:singleLine=</code><code>"true"</code><code>/></code>
另外一个就是ChildView,本例仿QQ好友列表,如图:
1354587095_4168.png (53.2 KB, 下载次数: 4)
2012-12-4 17:19 上传
布局child_item_layout.xml如下:
<code> </code><code>android:layout_width=</code><code>"fill_parent"</code>
<code> </code><code>android:layout_height=</code><code>"wrap_content"</code>
<code> </code><code>android:minHeight=</code><code>"@dimen/min_Height"</code>
<code> </code><code><SPAN style=</code><code>"COLOR: #ff0000"</code><code>>android:descendantFocusability=</code><code>"blocksDescendants"</code>
<code></SPAN> android:orientation=</code><code>"horizontal"</code> <code>></code>
<code> </code><code><ImageButton</code>
<code> </code><code>android:id=</code><code>"@+id/img"</code>
<code> </code><code>android:layout_width=</code><code>"@dimen/image_width"</code>
<code> </code><code>android:layout_height=</code><code>"@dimen/image_width"</code>
<code> </code><code>android:layout_marginLeft=</code><code>"2dip"</code>
<code> </code><code>android:layout_marginRight=</code><code>"10dip"</code>
<code> </code><code>android:layout_gravity=</code><code>"center_vertical"</code> <code>/></code>
<code> </code><code><LinearLayout</code>
<code> </code><code>android:layout_height=</code><code>"match_parent"</code>
<code> </code><code>android:descendantFocusability=</code><code>"blocksDescendants"</code>
<code> </code><code>android:orientation=</code><code>"vertical"</code> <code>></code>
<code> </code><code><TextView</code>
<code> </code><code>android:id=</code><code>"@+id/item_name"</code>
<code> </code><code>android:layout_width=</code><code>"wrap_content"</code>
<code> </code><code>android:layout_height=</code><code>"0.0dip"</code>
<code> </code><code>android:gravity=</code><code>"center_vertical"</code>
<code> </code><code>android:layout_weight=</code><code>"1"</code> <code>/></code>
<code> </code><code>android:id=</code><code>"@+id/item_detail"</code>
<code> </code><code>android:singleLine=</code><code>"true"</code>
<code> </code><code>android:ellipsize=</code><code>"end"</code>
<code> </code>
<code> </code><code></LinearLayout></code>
适配器弄好了,ExpandableListView就用系统的,现在只剩下显示的问题啦
先来几张效果图:
1354587948_2449.png (256.92 KB, 下载次数: 2)
2012-12-4 17:20 上传
<IGNORE_JS_OP>
1354587973_5081.png (327.25 KB, 下载次数: 7)
2012-12-4 17:21 上传
1354587996_4188.png (305.77 KB, 下载次数: 0)
<IGNORE_JS_OP>
1354588011_1830.png (174.7 KB, 下载次数: 0)
主Activity如下:
onChildClick
<code><SPAN xmlns=</code><code>"http://www.w3.org/1999/xhtml"</code><code>><SPAN xmlns=</code><code>"http://www.w3.org/1999/xhtml"</code><code>></code><code>package</code> <code>com.xyz.expande;</code>
<code>import</code> <code>java.util.ArrayList;</code>
<code>import</code> <code>android.app.Activity;</code>
<code>import</code> <code>android.content.DialogInterface;</code>
<code>import</code> <code>android.content.DialogInterface.OnClickListener;</code>
<code>import</code> <code>android.os.Bundle;</code>
<code>import</code> <code>android.view.ViewGroup.LayoutParams;</code>
<code>import</code> <code>android.widget.ExpandableListView;</code>
<code>import</code> <code>android.widget.ExpandableListView.OnChildClickListener;</code>
<code>public</code> <code>class</code> <code>HomeActivity</code><code>extends</code> <code>Activity</code><code>implements</code> <code>OnChildClickListener {</code>
<code> </code><code>private</code> <code>ExpandableListView mListView =</code><code>null</code><code>;</code>
<code> </code><code>private</code> <code>ExpandAdapter mAdapter =</code><code>null</code><code>;</code>
<code> </code><code>private</code> <code>List<List<Item>> mData =</code><code>new</code> <code>ArrayList<List<Item>>();</code>
<code> </code><code>private</code> <code>int</code><code>[] mGroupArrays =</code><code>new</code> <code>int</code><code>[] { </code>
<code> </code><code>R.array.tianlongbabu,</code>
<code> </code><code>R.array.shediaoyingxiongzhuan, </code>
<code> </code><code>R.array.shendiaoxialv };</code>
<code> </code><code>private</code> <code>int</code><code>[] mDetailIds =</code><code>new</code> <code>int</code><code>[] { </code>
<code> </code><code>R.array.tianlongbabu_detail,</code>
<code> </code><code>R.array.shediaoyingxiongzhuan_detail, </code>
<code> </code><code>R.array.shendiaoxialv_detail };</code>
<code> </code><code>private</code> <code>int</code><code>[][] mImageIds =</code><code>new</code> <code>int</code><code>[][] {</code>
<code> </code><code>{ R.drawable.img_00, </code>
<code> </code><code>R.drawable.img_01, </code>
<code> </code><code>R.drawable.img_02 },</code>
<code> </code><code>{ R.drawable.img_10, </code>
<code> </code><code>R.drawable.img_11, </code>
<code> </code><code>R.drawable.img_12,</code>
<code> </code><code>R.drawable.img_13, </code>
<code> </code><code>R.drawable.img_14, </code>
<code> </code><code>R.drawable.img_15,</code>
<code> </code><code>R.drawable.img_16 },</code>
<code> </code><code>{ R.drawable.img_20,</code>
<code> </code><code>R.drawable.img_21 } };</code>
<code> </code><code>/** Called when the activity is first created. */</code>
<code> </code><code>public</code> <code>void</code> <code>onCreate(Bundle savedInstanceState) {</code>
<code> </code><code>super</code><code>.onCreate(savedInstanceState);</code>
<code> </code><code>initData();</code>
<code> </code><code>mListView =</code><code>new</code> <code>ExpandableListView(</code><code>this</code><code>);</code>
<code> </code><code>mListView.setLayoutParams(</code><code>new</code> <code>LayoutParams(LayoutParams.FILL_PARENT,</code>
<code> </code><code>LayoutParams.FILL_PARENT));</code>
<code> </code><code>setContentView(mListView);</code>
<code> </code><code>mListView.setGroupIndicator(getResources().getDrawable(</code>
<code> </code><code>R.drawable.expander_floder));</code>
<code> </code><code>mAdapter =</code><code>new</code> <code>ExpandAdapter(</code><code>this</code><code>, mData);</code>
<code> </code><code>mListView.setAdapter(mAdapter);</code>
<code> </code><code>mListView</code>
<code> </code><code>.setDescendantFocusability(ExpandableListView.FOCUS_AFTER_DESCENDANTS);</code>
<code> </code><code>mListView.setOnChildClickListener(</code><code>this</code><code>);</code>
<code> </code><code><SPAN style=</code><code>"COLOR: #ff0000"</code><code>></code><code>/*</code>
<code> </code><code>* ChildView 设置 布局很可能onChildClick进不来,要在 ChildView layout 里加上</code>
<code> </code><code>* android:descendantFocusability="blocksDescendants",</code>
<code> </code><code>* 还有isChildSelectable里返回true</code>
<code> </code><code>*/</code>
<code></SPAN> </code><code>@Override</code>
<code> </code><code>public</code> <code>boolean</code> <code>onChildClick(ExpandableListView parent, View v,</code>
<code> </code><code>int</code> <code>groupPosition,</code><code>int</code> <code>childPosition,</code><code>long</code> <code>id) {</code>
<code> </code><code>Item item = mAdapter.getChild(groupPosition, childPosition);</code>
<code> </code><code>new</code> <code>AlertDialog.Builder(</code><code>this</code><code>)</code>
<code> </code><code>.setTitle(item.getName())</code>
<code> </code><code>.setMessage(item.getDetail())</code>
<code> </code><code>.setIcon(android.R.drawable.ic_menu_more)</code>
<code> </code><code>.setNegativeButton(android.R.string.cancel,</code>
<code> </code><code>new</code> <code>OnClickListener() {</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>void</code> <code>onClick(DialogInterface dialog,</code>
<code> </code><code>int</code> <code>which) {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>}</code>
<code> </code><code>}).create().show();</code>
<code> </code><code>return</code> <code>true</code><code>;</code>
<code> </code><code>private</code> <code>void</code> <code>initData() {</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i =</code><code>0</code><code>; i < mGroupArrays.length; i++) {</code>
<code> </code><code>List<Item> list =</code><code>new</code> <code>ArrayList<Item>();</code>
<code> </code><code>String[] childs = getStringArray(mGroupArrays<I>);</code>
<code> </code><code>String[] details = getStringArray(mDetailIds<I>);</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>j =</code><code>0</code><code>; j < childs.length; j++) {</code>
<code> </code><code>Item item =</code><code>new</code> <code>Item(mImageIds<I>[j], childs[j], details[j]);</code>
<code> </code><code>list.add(item);</code>
<code> </code><code>}</code>
<code> </code><code>mData.add(list);</code>
<code> </code><code>private</code> <code>String[] getStringArray(</code><code>int</code> <code>resId) {</code>
<code> </code><code>return</code> <code>getResources().getStringArray(resId);</code>
<code>}</SPAN></SPAN></code>
这这个demo的时候,想实现ChildView的点击事件,实现接口onChildClick,发现不进来,很尴尬。。。最后还是在网上找到答案了,第一,在适配器里isChildSelectable 必须返回true,第二,ChildView布局child_item_layout.xml最外层的layout设置个属性
细心的同学会发现 Item 是啥?也贴出来吧
<code>package</code> <code>com.xyz.expande;</code>
<code>public</code> <code>class</code> <code>Item {</code>
<code> </code>
<code> </code><code>private</code> <code>int</code> <code>resId;</code>
<code> </code><code>private</code> <code>String name;</code>
<code> </code><code>private</code> <code>String detail;</code>
<code> </code><code>public</code> <code>Item(</code><code>int</code> <code>resId, String name, String detail) {</code>
<code> </code><code>this</code><code>.resId = resId;</code>
<code> </code><code>this</code><code>.name = name;</code>
<code> </code><code>this</code><code>.detail = detail;</code>
<code> </code><code>public</code> <code>void</code> <code>setImageId(</code><code>int</code> <code>resId) {</code>
<code> </code><code>public</code> <code>int</code> <code>getImageId() {</code>
<code> </code><code>return</code> <code>resId;</code>
<code> </code><code>public</code> <code>void</code> <code>setName(String name) {</code>
<code> </code><code>public</code> <code>String getName() {</code>
<code> </code><code>return</code> <code>name;</code>
<code> </code><code>public</code> <code>void</code> <code>setDetail(String detail) {</code>
<code> </code><code>public</code> <code>String getDetail() {</code>
<code> </code><code>return</code> <code>detail;</code>
<code> </code><code>public</code> <code>String toString() {</code>
<code> </code><code>return</code> <code>"Item["</code> <code>+ resId +</code><code>", "</code> <code>+ name +</code><code>", "</code> <code>+ detail +</code><code>"]"</code><code>;</code>
<code>}</code>
源码下载: <IGNORE_JS_OP>
2012-12-4 17:23 上传
点击文件名下载附件
下载积分: e币 -10 元
<a href="http://www.eoeandroid.com/forum.php?mod=misc&action=attachcredit&aid=81469&formhash=2f2ef89c">http://www.eoeandroid.com/forum.php?mod=misc&action=attachcredit&aid=81469&formhash=2f2ef89c</a>
原文:http://blog.csdn.net/zhouyuanjing/article/details/8254421