之前的博文《Android 中使用ExpandableListView 实现分组的实例》我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信APP来对ExpandableListView做一个扩展介绍,实现效果如下(通讯里使用ExpandableListView实现):

相关知识点博文链接:
Android 中使用ExpandableListView 实现分组的实例
详解Android中fragment和viewpager的那点事儿
详解Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)
正常使用ExpandableListView的思路如下:
(1)要给ExpandableListView 设置适配器,那么必须先设置数据源。
(2)数据源,就是此处的适配器类ExpandableAdapter,此方法继承了BaseExpandableListAdapter ,它是ExpandableListView的一个子类。需要重写里面的多个方法。方法的意思,代码中都有详细的注释。数据源中,用到了自定义的View布局,此时根据自己的需求,来设置组和子项的布局样式。getChildView()和getGroupView()方法设置自定义布局。
(3)数据源设置好,直接给 ExpandableListView.setAdapter()即可实现此收缩功能。
但本次实现除以上实现步骤之外,还需要注意的有以下几点:
(1)首次加载ExpandableListView需要默认全部展开,使用以下方法:
在给ExpandableListView 设置适配器后,添加以下代码:
//Group.size()为组名个数,如果为数组存储则为group、length
for (int i = 0; i < Group.size(); i++) {
expandableListView.expandGroup(i);
}
提醒:加载前别忘了判断adapter是否为空和有没有Group数据哦
(2)保持ExpandableListView始终展开无法收缩
expandableListView.setOnGroupClickListener(new OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
return true;//返回true则表示无法收缩
}
});
(3)取消通讯录上方的groupName空间
微信通讯录中“新的朋友”,“群聊”,“标签”,“公众号”,作为一个整体自定义布局添加到ExpandableListView中,详情见以下代码实现
(4)修改ExpandableListView的分割线
大概思路就是这样,现在开始整体实现代码的演示:
第一步:layout中通讯录整体布局contactfragment.xml:
其实就是一个ExpandableListView,添加android:divider ="#FFFFFF"取消自带分割线
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/fragmentback"> <ExpandableListView android:id="@+id/contact_list" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:divider ="#FFFFFF"/> </LinearLayout>
第二步:layout中组名(groupName)的布局文件contact_list_group_item.xml:
注意设置间距,保证美观且尽量与微信一致
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/fragmentback"> <TextView android:text="TextView" android:textSize="20sp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:gravity="center_vertical" android:id="@+id/group_tv" /> </LinearLayout>
第三步:layout中ExpandableListView中每个item的布局文件contact_list_item.xml:
这里添加了自定义分割线
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:background="@color/colorwhite" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:paddingLeft="10dp" android:paddingTop="5dp" android:paddingBottom="5dp" android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/contact_item_iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/default_fmessage" android:adjustViewBounds="true" android:maxWidth="35dp"/> <TextView android:id="@+id/contact_item_tv" android:layout_margin="10dp" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="新的朋友"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="@color/fragmentback"/> </LinearLayout> </LinearLayout>
第四步:layout中ExpandableListView中的头布局contact_list_title.xml(不需要groupName)
我们观察微信通讯录布局中“新的朋友”,“群聊”,“标签”,“公众号”上方直接为微信的顶部导航,不存在ExpandableListView一贯的组名布局,这里我们将“新的朋友”,“群聊”,“标签”的布局单独实现:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:background="@color/colorwhite" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:paddingLeft="10dp" android:paddingTop="5dp" android:paddingBottom="5dp" android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/default_fmessage" android:adjustViewBounds="true" android:maxWidth="35dp"/> <TextView android:layout_margin="10dp" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="新的朋友"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="@color/fragmentback"/> <LinearLayout android:paddingLeft="10dp" android:paddingTop="5dp" android:paddingBottom="5dp" android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/default_chatroom" android:adjustViewBounds="true" android:maxWidth="35dp"/> <TextView android:layout_margin="10dp" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="群聊"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="@color/fragmentback"/> <LinearLayout android:paddingLeft="10dp" android:paddingTop="5dp" android:paddingBottom="5dp" android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/default_contactlabel" android:adjustViewBounds="true" android:maxWidth="35dp"/> <TextView android:layout_margin="10dp" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="标签"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="@color/fragmentback"/> <LinearLayout android:paddingLeft="10dp" android:paddingTop="5dp" android:paddingBottom="5dp" android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/default_servicebrand_contact" android:adjustViewBounds="true" android:maxWidth="35dp"/> <TextView android:layout_margin="10dp" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="公众号"/> </LinearLayout> </LinearLayout> </LinearLayout>
第五步:java中定义继承BaseExpandableListAdapter类(自定义适配器)
(1)这里模仿实际项目,将自定义适配器定义定义在外部同意管理,所以需要设置相关构造方法供expandableListView调用
(2)为了实现头文件的布局,需要在getGroupView与getChildView方法中判断头文件的位置,从而调整布局,这里我们将头文件定义在数据首位
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;
import com.mly.panhouye.wechat.R;
/**
* Created by panchengjia on 2016/12/28 0028.
*/
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
Context context;
String[] group;
String[][] itemName;
int[][] itemIcon;
public MyExpandableListAdapter(Context context, String[] group, String[][] itemName, int[][] itemIcon) {
this.context = context;
this.group = group;
this.itemName = itemName;
this.itemIcon = itemIcon;
}
@Override
public int getGroupCount() {
return group.length;
}
@Override
public int getChildrenCount(int groupPosition) {
return itemName[groupPosition].length;
}
@Override
public Object getGroup(int groupPosition) {
return group[groupPosition];
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return itemName[groupPosition][childPosition];
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
ViewHolder vh;
//ExpandableList的第一个分组没有组名,这里需要自定义布局
if(groupPosition==0){
convertView =LayoutInflater.from(context).inflate(R.layout.contact_list_title,null);
}else{
if(convertView==null){
convertView= LayoutInflater.from(context).inflate(R.layout.contact_list_group_item,null);
vh = new ViewHolder();
vh.tv = (TextView) convertView.findViewById(R.id.group_tv);
convertView.setTag(vh);
}
vh = (ViewHolder) convertView.getTag();
vh.tv.setText(group[groupPosition]);
}
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ViewHolder vh;
//ExpandableList的第一个分组没有组名,这里需要自定义布局
if (groupPosition==0){
convertView =LayoutInflater.from(context).inflate(R.layout.contact_list_title,null);
}else{
if(convertView==null){
convertView= LayoutInflater.from(context).inflate(R.layout.contact_list_item,null);
vh = new ViewHolder();
vh.tv = (TextView) convertView.findViewById(R.id.contact_item_tv);
vh.iv= (ImageView) convertView.findViewById(R.id.contact_item_iv);
convertView.setTag(vh);
}
vh = (ViewHolder) convertView.getTag();
vh.tv.setText(itemName[groupPosition][childPosition]);
vh.iv.setImageResource(itemIcon[groupPosition][childPosition]);
}
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
class ViewHolder{
TextView tv;
ImageView iv;
}
}
第六步:java中重写之前的与contactfragment.xml布局对应的ContactFragment.java类
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListView;
import com.mly.panhouye.wechat.R;
import com.mly.panhouye.wechat.adapter.MyExpandableListAdapter;
/**
* Created by panchengjia on 2016/12/28 0028.
*/
public class ContactFragment extends Fragment {
private ExpandableListView contact_list;
//定义分组以及组内成员(设置头文件位置为空)
String[] group ={"","好友列表"};
String[][] itemName={{},{"郭嘉", "黄月英", "华佗",
"刘备", "陆逊", "吕布", "吕蒙", "马超", "司马懿", "孙权", "孙尚香", "夏侯惇",
"许褚", "杨修", "张飞", "赵云", "甄姬", "周瑜", "诸葛亮"}};
int[][] itemIcon={{},{R.mipmap.guojia,
R.mipmap.huangyueying, R.mipmap.huatuo,
R.mipmap.liubei, R.mipmap.luxun, R.mipmap.lvbu, R.mipmap.lvmeng,
R.mipmap.machao, R.mipmap.simayi, R.mipmap.sunquan, R.mipmap.sunshangxiang,
R.mipmap.xiahoudun, R.mipmap.xuchu, R.mipmap.yangxiu, R.mipmap.zhangfei,
R.mipmap.zhaoyun, R.mipmap.zhenji, R.mipmap.zhouyu, R.mipmap.zhugeliang}};
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.contact_fragment,container,false);
contact_list = (ExpandableListView) view.findViewById(R.id.contact_list);
//实例化适配器
MyExpandableListAdapter myExpandableListAdapter=new MyExpandableListAdapter(getContext(),group,itemName,itemIcon);
//配置适配器
contact_list.setAdapter(myExpandableListAdapter);
//去掉ExpandableListView 默认的箭头
contact_list.setGroupIndicator(null);
//设置ExpandableListView默认展开
for (int i = 0; i <group.length; i++) {
contact_list.expandGroup(i);
}
//设置ExpandableListView不可点击收回
contact_list.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
return true;
}
});
return view;
}
}
实现方法很多大家开动吧(建议使用recyclerView)。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# Android
# Expandablelistview
# Android ExpandableListView双层嵌套实现三级树形菜单
# Android ExpandableListView实现下拉刷新和加载更多效果
# Android ExpandableListView单选以及多选实现代码
# Android中ExpandableListView使用示例详解
# Android ScrollView嵌套ExpandableListView显示不正常的问题的解决办
# Android listview ExpandableListView实现多选
# 单选
# 全选
# edittext实现批量输入的实例代码
# Android 关于ExpandableListView刷新问题的解决方法
# Android ExpandableListView使用方法案例详解
# 自定义
# 分割线
# 第一个
# 头文件
# 重写
# 华佗
# 为空
# 自己的
# 博文
# 加载
# 都有
# 首次
# 多个
# 子类
# 不需要
# 它是
# 要注意
# 不存在
# 做一个
# 作为一个
相关文章:
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
移民网站制作流程,怎么看加拿大移民官网?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
建站之家VIP精选网站模板与SEO优化教程整合指南
建站之星如何取消后台验证码生成?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
如何访问已购建站主机并解决登录问题?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
如何高效利用亚马逊云主机搭建企业网站?
建站主机功能解析:服务器选择与快速搭建指南
佛山网站制作系统,佛山企业变更地址网上办理步骤?
建站之星与建站宝盒如何选择最佳方案?
,怎么用自己头像做动态表情包?
c# 服务器GC和工作站GC的区别和设置
如何在阿里云域名上完成建站全流程?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何选择PHP开源工具快速搭建网站?
如何通过虚拟主机快速搭建个人网站?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
如何在橙子建站中快速调整背景颜色?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
测试制作网站有哪些,测试性取向的权威测试或者网站?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
如何选择香港主机高效搭建外贸独立站?
设计网站制作公司有哪些,制作网页教程?
如何在Golang中指定模块版本_使用go.mod控制版本号
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
建站之星24小时客服电话如何获取?
教学网站制作软件,学习*后期制作的网站有哪些?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
在线教育网站制作平台,山西立德教育官网?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
家庭服务器如何搭建个人网站?
建设网站制作价格,怎样建立自己的公司网站?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
建站主机选购指南:核心配置与性价比推荐解析
建站之星IIS配置教程:代码生成技巧与站点搭建指南
如何在西部数码注册域名并快速搭建网站?
如何通过VPS建站无需域名直接访问?
如何快速查询网站的真实建站时间?
如何配置FTP站点权限与安全设置?
建站之星代理费用多少?最新价格详情介绍
,南京靠谱的征婚网站?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
*请认真填写需求信息,我们会在24小时内与您取得联系。