返回顶部
首页 > 资讯 > 移动开发 >Android中使用Expandablelistview实现微信通讯录界面
  • 360
分享到

Android中使用Expandablelistview实现微信通讯录界面

界面expandablelistviewAndroid 2022-06-06 05:06:42 360人浏览 八月长安
摘要

之前的博文《Android 中使用ExpandableListView 实现分组的实例》我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对

之前的博文《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;

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;

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 通过向viewpage中添加listview来完成滑动效果(类似于qq滑动界面)android Listview模拟聊天界面Android 新闻界面模拟ListView和ViewPager的应用Android ListView自定义Adapter实现仿QQ界面Android App界面的ListView布局实战演练android动态布局之动态加入TextView和ListView的方法Android ListView添加头布局和脚布局实例详解Android实现的ListView分组布局改进示例神奇的listView实现自动显示隐藏布局Android代码Android开发之ListView的简单用法及定制ListView界面操作示例


--结束END--

本文标题: Android中使用Expandablelistview实现微信通讯录界面

本文链接: https://lsjlt.com/news/22761.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android中使用Expandablelistview实现微信通讯录界面
    之前的博文《Android 中使用ExpandableListView 实现分组的实例》我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对...
    99+
    2022-06-06
    界面 expandablelistview Android
  • android 仿微信demo——微信通讯录界面功能实现(移动端,服务端)
    目录移动端微信通讯录界面功能实现服务端微信通讯录界面功能实现测试总结 前面我们实现了微信消息界面的实现,这篇继续完善微信功能,实现微信通讯录界面 移动端微信通讯录界面功能实现 微信...
    99+
    2024-04-02
  • android 仿微信demo——微信主界面实现
    目录主界面实现测试总结 以往文章中实现微信启动页,登录注册功能,此基础上继续完善仿微信功能。 主界面实现 (1)整体采用RelativeLayout相对布局 (2)最上面是too...
    99+
    2024-04-02
  • android如何实现仿微信通讯录搜索
    这篇文章将为大家详细讲解有关android如何实现仿微信通讯录搜索,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:先看效果图字母索引搜索匹配二:功能分析1:汉字转拼音通讯录汉字转拼音(首个字符当考虑姓氏...
    99+
    2023-05-30
    android
  • android 仿微信demo——微信启动界面实现
    目录微信启动界面创建项目微信启动界面实现测试总结微信启动界面 创建项目 android studio创建移动端项目 微信启动界面实现 当第一次点击微信时会看到微信出现启动界...
    99+
    2024-04-02
  • Android自定义View实现通讯录字母索引(仿微信通讯录)
    一、效果:我们看到很多软件的通讯录在右侧都有一个字母索引功能,像微信,小米通讯录,QQ,还有美团选择地区等等。这里我截了一张美团选择城市的图片来看看; 我们今天就来实现图片中...
    99+
    2022-06-06
    仿微信 view 字母 索引 Android
  • Java实现简易界面通讯录
    前言 这个也是Java实验课程的一个作业,和Java实现简单的图形界面计算器一起做的,因为以前没有做过GUI编程,所以做的非常简陋,还有很多BUG,但是感觉当个作业也够了。 程序功能...
    99+
    2024-04-02
  • 微信小程序实现登录界面
    微信小程序的登录界面实现,供大家参考,具体内容如下 <view class="container"> <view class="wrapper"> ...
    99+
    2024-04-02
  • Android ListView实现仿微信聊天界面
    本篇内容主要讲解“Android ListView实现仿微信聊天界面”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android ListView实现仿微信聊天界面”吧!Android List...
    99+
    2023-06-20
  • android 仿微信demo——微信消息界面实现(移动端)
    目录移动端微信消息页实现总结移动端微信消息页实现 在上一篇中主界面实现说过微信四个页面中间都是是fragment的,并且四个fragment的布局都还没实现,所以这一篇主要实现微信...
    99+
    2024-04-02
  • android 仿微信demo——微信消息界面实现(服务端)
    目录服务端微信消息页实现测试总结 上一篇实现了移动端微信消息界面功能,以此为基础继续完善服务端功能 服务端微信消息页实现 微信消息界面的实现,和登录,注册是类似的,无非就是接受客...
    99+
    2024-04-02
  • 微信小程序实现登录界面示例
    本文实例为大家分享了微信小程序实现登录界面的具体代码,供大家参考,具体内容如下 注:这里使用的是原生微信小程序 使用wxss和wxml index.wxml文件中代码 <vie...
    99+
    2024-04-02
  • 微信小程序如何实现登录界面
    这篇文章主要介绍“微信小程序如何实现登录界面”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“微信小程序如何实现登录界面”文章能帮助大家解决问题。注:这里使用的是原生微信小程序使用wxss和wxmlin...
    99+
    2023-06-30
  • 微信小程序实现登录注册界面
    本文实例为大家分享了微信小程序实现登录注册界面的具体代码,供大家参考,具体内容如下 微信小程序登录注册界面demo,存在不足之处,请指教! 界面图片: 1.js代码: Page(...
    99+
    2024-04-02
  • Android 中使用ExpandableListView 实现分组的实例
     Android 中使用ExpandableListView 实现分组 一个视图显示垂直滚动两级列表中的条目。这不同于列表视图,允许两个层次,类似于QQ的好友分组。要...
    99+
    2022-06-06
    expandablelistview 分组 Android
  • 微信小程序中怎么使用GoEasy实现实时通讯
    本篇文章给大家分享的是有关微信小程序中怎么使用GoEasy实现实时通讯,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、获取appkeyGoE...
    99+
    2024-04-02
  • Android中使用eventbus3.0实现fragment通信
    今天就跟大家聊聊有关Android中使用eventbus3.0实现fragment通信,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.概述在之前的博文中简单介绍过如何实现fragm...
    99+
    2023-05-31
    android eventbus3.0 fragment
  • 怎么在Android中使用Kotlin实现一个登录界面
    怎么在Android中使用Kotlin实现一个登录界面?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。登录界面代码如下:class LoginActiv...
    99+
    2023-05-30
    android kotlin
  • 微信小程序如何使用WebSocket实现即时通讯
    使用WebSocket实现即时通讯功能,可以让用户实时收发消息,并保持连接状态。在微信小程序中,可以通过wx.connectSock...
    99+
    2024-04-03
    微信小程序 WebSocket
  • android使用ExpandableListView控件实现小说目录效果的例子
    今天给大家讲讲android的目录实现方法,就像大家看到的小说目录一样,android 提供了ExpandableListView控件可以实现二级列表展示效果,现在给大家讲讲这...
    99+
    2022-06-06
    expandablelistview 小说 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作