天天看点

android 实现QQ好友列表

        下面看看继承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>&lt;SPAN xmlns=</code><code>"http://www.w3.org/1999/xhtml"</code><code>&gt;</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&lt;List&lt;Item&gt;&gt;   mData =</code><code>null</code><code>;</code>

<code>   </code><code>public</code> <code>ExpandAdapter(Context ctx, List&lt;List&lt;Item&gt;&gt; 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&lt;List&lt;Item&gt;&gt; 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&lt;Item&gt; 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>&lt;SPAN style=</code><code>"COLOR: #cc0000"</code><code>&gt;</code><code>/*很重要:实现ChildView点击事件,必须返回true*/</code>

<code>&lt;/SPAN&gt;        </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>&lt;/LinearLayout&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;</code>

        TextView mDetail;

    }

}

&lt;/SPAN&gt;[/mw_shl_code]

里面用到的有两个布局,GroupView(子list没展开的view)如图:  

&lt;IGNORE_JS_OP&gt;

android 实现QQ好友列表

1354586842_7926.png (28.18 KB, 下载次数: 3)

2012-12-4 17:17 上传

布局group_item_layout.xml如下:

<code>&lt;SPAN xmlns=</code><code>"http://www.w3.org/1999/xhtml"</code><code>&gt;&lt;SPAN xmlns=</code><code>"http://www.w3.org/1999/xhtml"</code><code>&gt;&lt;?xml version=</code><code>"1.0"</code> <code>encoding=</code><code>"utf-8"</code><code>?&gt;</code>

<code>&lt;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>&gt;</code>

<code>   </code><code>&lt;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>/&gt;</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>/&gt;</code>

另外一个就是ChildView,本例仿QQ好友列表,如图:

android 实现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>&lt;SPAN style=</code><code>"COLOR: #ff0000"</code><code>&gt;android:descendantFocusability=</code><code>"blocksDescendants"</code>

<code>&lt;/SPAN&gt;    android:orientation=</code><code>"horizontal"</code> <code>&gt;</code>

<code>   </code><code>&lt;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>/&gt;</code>

<code>   </code><code>&lt;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>&gt;</code>

<code>        </code><code>&lt;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>/&gt;</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>&lt;/LinearLayout&gt;</code>

适配器弄好了,ExpandableListView就用系统的,现在只剩下显示的问题啦

先来几张效果图:

android 实现QQ好友列表

1354587948_2449.png (256.92 KB, 下载次数: 2)

2012-12-4 17:20 上传

    &lt;IGNORE_JS_OP&gt;

android 实现QQ好友列表

1354587973_5081.png (327.25 KB, 下载次数: 7)

2012-12-4 17:21 上传

android 实现QQ好友列表

1354587996_4188.png (305.77 KB, 下载次数: 0)

   &lt;IGNORE_JS_OP&gt;

android 实现QQ好友列表

1354588011_1830.png (174.7 KB, 下载次数: 0)

主Activity如下:

onChildClick

<code>&lt;SPAN xmlns=</code><code>"http://www.w3.org/1999/xhtml"</code><code>&gt;&lt;SPAN xmlns=</code><code>"http://www.w3.org/1999/xhtml"</code><code>&gt;</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&lt;List&lt;Item&gt;&gt; mData =</code><code>new</code> <code>ArrayList&lt;List&lt;Item&gt;&gt;();</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>&lt;SPAN style=</code><code>"COLOR: #ff0000"</code><code>&gt;</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>&lt;/SPAN&gt;   </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 &lt; mGroupArrays.length; i++) {</code>

<code>            </code><code>List&lt;Item&gt; list =</code><code>new</code> <code>ArrayList&lt;Item&gt;();</code>

<code>            </code><code>String[] childs = getStringArray(mGroupArrays&lt;I&gt;);</code>

<code>            </code><code>String[] details = getStringArray(mDetailIds&lt;I&gt;);</code>

<code>            </code><code>for</code> <code>(</code><code>int</code> <code>j =</code><code>0</code><code>; j &lt; childs.length; j++) {</code>

<code>               </code><code>Item item =</code><code>new</code> <code>Item(mImageIds&lt;I&gt;[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>}&lt;/SPAN&gt;&lt;/SPAN&gt;</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>

源码下载: &lt;IGNORE_JS_OP&gt;

android 实现QQ好友列表

2012-12-4 17:23 上传

点击文件名下载附件

下载积分: e币 -10 元

<a href="http://www.eoeandroid.com/forum.php?mod=misc&amp;action=attachcredit&amp;aid=81469&amp;formhash=2f2ef89c">http://www.eoeandroid.com/forum.php?mod=misc&amp;action=attachcredit&amp;aid=81469&amp;formhash=2f2ef89c</a>

原文:http://blog.csdn.net/zhouyuanjing/article/details/8254421

继续阅读