android 实现QQ好友列表
在某些Android开发群里,看到有些新手问怎么实现QQ好友列表,其实网上一搜挺多的。接触Android,也才一年的时间,大部分时间花在工作上(解bug。。。),界面上开发很少参与。自己维护的系统应用里,有个ExpandableListView的界面(其实android例子APIDemo也有类似的例子)就在这里写个Demo供新手参考。 ExpandableListView的用法:难点就是重写BaseExpandableListAdapter及提供的数据源。
下面看看继承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
|
<SPAN xmlns="http://www.w3.org/1999/xhtml">package com.xyz.expande; import java.util.List; import android.app.AlertDialog; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ImageView; import android.widget.TextView; public class ExpandAdapter extends BaseExpandableListAdapter { private Context mContext; private LayoutInflater mInflater = null; private String[] mGroupStrings = null; private List<List<Item>> mData = null; public ExpandAdapter(Context ctx, List<List<Item>> list) { mContext = ctx; mInflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); mGroupStrings = mContext.getResources().getStringArray(R.array.groups); mData = list; } public void setData(List<List<Item>> list) { mData = list; } @Override public int getGroupCount() { // TODO Auto-generated method stub return mData.size(); } @Override public int getChildrenCount(int groupPosition) { // TODO Auto-generated method stub return mData.get(groupPosition).size(); } @Override public List<Item> getGroup(int groupPosition) { // TODO Auto-generated method stub return mData.get(groupPosition); } @Override public Item getChild(int groupPosition, int childPosition) { // TODO Auto-generated method stub return mData.get(groupPosition).get(childPosition); } @Override public long getGroupId(int groupPosition) { // TODO Auto-generated method stub return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return childPosition; } @Override public boolean hasStableIds() { // TODO Auto-generated method stub return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if (convertView == null) { convertView = mInflater.inflate(R.layout.group_item_layout, null); } GroupViewHolder holder = new GroupViewHolder(); holder.mGroupName = (TextView) convertView .findViewById(R.id.group_name); holder.mGroupName.setText(mGroupStrings[groupPosition]); holder.mGroupCount = (TextView) convertView .findViewById(R.id.group_count); holder.mGroupCount.setText("[" + mData.get(groupPosition).size() + "]"); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if (convertView == null) { convertView = mInflater.inflate(R.layout.child_item_layout, null); } ChildViewHolder holder = new ChildViewHolder(); holder.mIcon = (ImageView) convertView.findViewById(R.id.img); holder.mIcon.setBackgroundResource(getChild(groupPosition, childPosition).getImageId()); holder.mChildName = (TextView) convertView.findViewById(R.id.item_name); holder.mChildName.setText(getChild(groupPosition, childPosition) .getName()); holder.mDetail = (TextView) convertView.findViewById(R.id.item_detail); holder.mDetail.setText(getChild(groupPosition, childPosition) .getDetail()); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // TODO Auto-generated method stub <SPAN style="COLOR: #cc0000">/*很重要:实现ChildView点击事件,必须返回true*/</SPAN> return true; } private class GroupViewHolder { TextView mGroupName; TextView mGroupCount; } private class ChildViewHolder { ImageView mIcon; TextView mChildName; </LinearLayout></SPAN></SPAN> |
TextView mDetail;
}
}
</SPAN>[/mw_shl_code]
里面用到的有两个布局,GroupView(子list没展开的view)如图:
<IGNORE_JS_OP>
布局group_item_layout.xml如下:
|
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
|
<SPAN xmlns="http://www.w3.org/1999/xhtml"><SPAN xmlns="http://www.w3.org/1999/xhtml"><?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:orientation="horizontal" > <TextView android:id="@+id/group_name" android:layout_width="wrap_content" android:layout_height="?android:attr/listPreferredItemHeight" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_marginLeft="35dip" android:gravity="center_vertical" android:singleLine="true" /> <TextView android:id="@+id/group_count" android:layout_width="wrap_content" android:layout_height="?android:attr/listPreferredItemHeight" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_marginLeft="5dip" android:gravity="center_vertical" android:singleLine="true"/> </LinearLayout></SPAN></SPAN> |
另外一个就是ChildView,本例仿QQ好友列表,如图:
<IGNORE_JS_OP>
布局child_item_layout.xml如下:
|
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
|
<SPAN xmlns="http://www.w3.org/1999/xhtml"><SPAN xmlns="http://www.w3.org/1999/xhtml"><?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="wrap_content" android:minHeight="@dimen/min_Height" <SPAN style="COLOR: #ff0000">android:descendantFocusability="blocksDescendants"</SPAN> android:orientation="horizontal" > <ImageButton android:id="@+id/img" android:layout_width="@dimen/image_width" android:layout_height="@dimen/image_width" android:layout_marginLeft="2dip" android:layout_marginRight="10dip" android:layout_gravity="center_vertical" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:descendantFocusability="blocksDescendants" android:orientation="vertical" > <TextView android:id="@+id/item_name" android:layout_width="wrap_content" android:layout_height="0.0dip" android:gravity="center_vertical" android:layout_weight="1" /> <TextView android:id="@+id/item_detail" android:layout_width="wrap_content" android:layout_height="0.0dip" android:gravity="center_vertical" android:singleLine="true" android:ellipsize="end" android:layout_weight="1" /> </LinearLayout> </LinearLayout></SPAN></SPAN> |
适配器弄好了,ExpandableListView就用系统的,现在只剩下显示的问题啦
先来几张效果图:
<IGNORE_JS_OP>
<IGNORE_JS_OP>
<IGNORE_JS_OP>
<IGNORE_JS_OP>
主Activity如下:
onChildClick
|
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
|
<SPAN xmlns="http://www.w3.org/1999/xhtml"><SPAN xmlns="http://www.w3.org/1999/xhtml">package com.xyz.expande; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.ExpandableListView; import android.widget.ExpandableListView.OnChildClickListener; public class HomeActivity extends Activity implements OnChildClickListener { private ExpandableListView mListView = null; private ExpandAdapter mAdapter = null; private List<List<Item>> mData = new ArrayList<List<Item>>(); private int[] mGroupArrays = new int[] { R.array.tianlongbabu, R.array.shediaoyingxiongzhuan, R.array.shendiaoxialv }; private int[] mDetailIds = new int[] { R.array.tianlongbabu_detail, R.array.shediaoyingxiongzhuan_detail, R.array.shendiaoxialv_detail }; private int[][] mImageIds = new int[][] { { R.drawable.img_00, R.drawable.img_01, R.drawable.img_02 }, { R.drawable.img_10, R.drawable.img_11, R.drawable.img_12, R.drawable.img_13, R.drawable.img_14, R.drawable.img_15, R.drawable.img_16 }, { R.drawable.img_20, R.drawable.img_21 } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initData(); mListView = new ExpandableListView(this); mListView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); setContentView(mListView); mListView.setGroupIndicator(getResources().getDrawable( R.drawable.expander_floder)); mAdapter = new ExpandAdapter(this, mData); mListView.setAdapter(mAdapter); mListView .setDescendantFocusability(ExpandableListView.FOCUS_AFTER_DESCENDANTS); mListView.setOnChildClickListener(this); } <SPAN style="COLOR: #ff0000">/* * ChildView 设置 布局很可能onChildClick进不来,要在 ChildView layout 里加上 * android:descendantFocusability="blocksDescendants", * 还有isChildSelectable里返回true */</SPAN> @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { // TODO Auto-generated method stub Item item = mAdapter.getChild(groupPosition, childPosition); new AlertDialog.Builder(this) .setTitle(item.getName()) .setMessage(item.getDetail()) .setIcon(android.R.drawable.ic_menu_more) .setNegativeButton(android.R.string.cancel, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }).create().show(); return true; } private void initData() { for (int i = 0; i < mGroupArrays.length; i++) { List<Item> list = new ArrayList<Item>(); String[] childs = getStringArray(mGroupArrays<I>); String[] details = getStringArray(mDetailIds<I>); for (int j = 0; j < childs.length; j++) { Item item = new Item(mImageIds<I>[j], childs[j], details[j]); list.add(item); } mData.add(list); } } private String[] getStringArray(int resId) { return getResources().getStringArray(resId); } }</SPAN></SPAN> |
这这个demo的时候,想实现ChildView的点击事件,实现接口onChildClick,发现不进来,很尴尬。。。最后还是在网上找到答案了,第一,在适配器里isChildSelectable 必须返回true,第二,ChildView布局child_item_layout.xml最外层的layout设置个属性
细心的同学会发现 Item 是啥?也贴出来吧
|
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
|
package com.xyz.expande; public class Item { private int resId; private String name; private String detail; public Item(int resId, String name, String detail) { this.resId = resId; this.name = name; this.detail = detail; } public void setImageId(int resId) { this.resId = resId; } public int getImageId() { return resId; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setDetail(String detail) { this.detail = detail; } public String getDetail() { return detail; } public String toString() { return "Item[" + resId + ", " + name + ", " + detail + "]"; } } |
源码下载: <IGNORE_JS_OP>
ExpandeList.zip (670.11 KB, 下载次数: 988)
点击文件名下载附件
下载积分: e币 -10 元
http://www.eoeandroid.com/forum.php?mod=misc&action=attachcredit&aid=81469&formhash=2f2ef89c
原文:http://blog.csdn.net/zhouyuanjing/article/details/8254421
android 实现QQ好友列表的更多相关文章
- iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一)
iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一) 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableViewController // ...
- [iOS基础控件 - 6.9.3] QQ好友列表Demo TableView
A.需求 1.使用plist数据,展示类似QQ好友列表的分组.组内成员显示缩进功能 2.组名使用Header,展示箭头图标.组名.组内人数和上线人数 3.点击组名,伸展.缩回好友组 code so ...
- 仿QQ好友列表界面的实现
TableView有2种style:UITableViewStylePlain 和 UITableViewStyleGrouped. 但是QQ好友列表的tableView给人的感觉似乎是2个style ...
- ExpandableListView仿QQ好友列表
本例中,对ExpandableListView中的数据进行了封装,分为两个JavaBean,一个为Group类表示组信息,一个Child类表示该组下子列表信息: Group: public class ...
- (二十七)QQ好友列表的实现
QQ好友列表通过plist读取,plist的结构为一组字典,每个字典内有本组的信息和另外一组字典代表好友. 要读取plist,选择合适的数据结构,例如NSArray,然后调用initWithConte ...
- 基于Qt的相似QQ好友列表抽屉效果的实现
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/shuideyidi/article/details/30619167 前段时间在忙毕业设计, ...
- swift 实现QQ好友列表功能
最近项目中有类似QQ好友列表功能,整理了一下,话不多说,直接上代码 import UIKit class QQFriend: NSObject { var name: String? var intr ...
- Windows UIA自动化测试框架学习--获取qq好友列表
前段时间应公司要求开发一款针对现有WPF程序的自动化测试工具,在网上查资料找了一段时间,发现用来做自动化测试的框架还是比较多的,比如python的两个模块pywinauto和uiautomation, ...
- OS开发UI篇—使用UItableview完成一个简单的QQ好友列表
本文转自:http://www.cnblogs.com/wendingding/p/3763330.html 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableVi ...
随机推荐
- Codeforces Round #356 (Div. 2) E. Bear and Square Grid 滑块
E. Bear and Square Grid 题目连接: http://www.codeforces.com/contest/680/problem/E Description You have a ...
- Perforce-Server迁移
Author: JinDate: 20140827System: Windows 2008 R2 从Windows 2008 R2迁移到Windows 2008 R2 linux版本迁移官方文档htt ...
- hadoop 2.7.1 高可用安装部署
hadoop集群规划 目标:创建2个NameNode,做高可用,一个NameNode挂掉,另一个能够启动:一个运行Yarn,3台DataNode,3台Zookeeper集群,做高可用. 在hadoop ...
- 使用Chrome快速实现数据的抓取(二)——协议
在前面的文章简单的介绍了一下Chrome调试模式的启动方式,但前面的API只能做到简单的打开,关闭标签操作,当我们需要对某个标签页进行详细的操作时,则需要用到页面管理API.首先我们还是来回顾下获取页 ...
- Red Hat Enterprise Linux 7.4上安装Oracle 11.2.0.4
1. 配置Yum源及关闭SeLinux [root@localhost ~]# mkdir /media/rhel [root@localhost ~]# mount /dev/cdrom /medi ...
- 报错:未能加载文件或程序集“WebGrease, Version=1.5.1.25624, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
□ 背景 通过NuGet安装某程序包后,运行程序出现如上错误. □ 分析 可能是程序集版本不兼容引起的,可以通过NuGet先把程序包删除,然后再安装最新或某个版本的程序包. □ 解决方法 通过 ...
- UI----------------Toggle
Is On:是否已经勾选上了 Toggle Transition:渐变效果 Graphic:勾选标志的图,就是那个勾 Group:多选组 On Value Changed:当选项改变时,触发事件 多选 ...
- 80x86 CPU 的工作模式
8086/8088微处理器只有一种工作模式:实地址模式. 32为的80x86微处理器有3种工作模式:实地址模式.保护模式和虚拟8086模式. 实地址模式 对于8086/8088微处理器,实模式是它 ...
- selenium3+python自动化50-环境搭建(firefox)
前言 有不少小伙伴在安装selenium环境后启动firefox报错,因为现在selenium升级到3.0了,跟2.0的版本还有有一点区别的. 安装环境过程中主要会遇到三个坑: 1.'geckodri ...
- icanhazip.com 使你在不论什么地方知道你的公网IP地址
icanhazip.com 使你在不论什么地方知道你的公网IP地址 icanhazip.com是一个网址,你在浏览器中输入这个网址,你就能得到你的公网IP地址了. 我在Linux下一般使用curl i ...