之前使用的SimpleExpandableListAdapter有较大局限性,样式单一,修改难度大,这里不建议使用,而是利用BaseExpandableListAdapter,其实SimpleExpandableListAdapter也是继承自BaseExpandableListAdapter,这里用到的布局和上一个一样,先定义一个内部类MyExpandableListViewAdapter继承自BaseExpandableListAdapter,需要实现几个方法:

1.getGroupCount() 返回父元素的个数

2.getChildrenCount(int groupPosition) 返回当前父元素下的子元素个数

3.getGroup(int groupPosition) 返回当前父元素的数据

4.getChild(int groupPosition, int childPosition) 返回当前父元素下子元素的数据

5.getGroupId(int groupPosition) 返回当前父元素的id

6.getChildId(int groupPosition, int childPosition) 返回当前父元素下的子元素的id

7.hasStableIds() 是否有稳定的id,这里默认false不修改

8.getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) 返回当前父元素的view

9.getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) 返回当前子元素的view

10.isChildSelectable(int groupPosition, int childPosition) 是否可以选择,默认false,这里用不到,不修改

SecondActivity

package com.fitsoft;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView; public class SecondActivity extends AppCompatActivity { ExpandableListView expandableListView; MyExpandableListViewAdapter myExpandableListViewAdapter; String[] groupStringArr = {"腾讯", "百度", "阿里巴巴"}; String[][] childStringArr = {
{"QQ","微信","QQ浏览器"},
{"百度搜索","百度地图","百度外卖"},
{"淘宝","支付宝","天猫商城"}
}; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); expandableListView = findViewById(R.id.expandable_ListView); myExpandableListViewAdapter = new MyExpandableListViewAdapter(); expandableListView.setAdapter(myExpandableListViewAdapter); } class MyExpandableListViewAdapter extends BaseExpandableListAdapter { @Override
public int getGroupCount() {
return groupStringArr.length;
} @Override
public int getChildrenCount(int groupPosition) {
return childStringArr[groupPosition].length;
} @Override
public Object getGroup(int groupPosition) {
return groupStringArr[groupPosition];
} @Override
public Object getChild(int groupPosition, int childPosition) {
return childStringArr[groupPosition][childPosition];
} @Override
public long getGroupId(int groupPosition) {
return groupPosition * 100;
} @Override
public long getChildId(int groupPosition, int childPosition) {
return groupPosition * 100 + childPosition;
} @Override
public boolean hasStableIds() {
return false;
} @Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { View view = convertView;
if(view == null){
view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item_group, parent, false);
} Object data = getGroup(groupPosition); TextView textView = view.findViewById(R.id.tv_group);
textView.setText(data.toString()); if(groupPosition % 2 == 1){
textView.setTextColor(Color.RED);
}else{
textView.setTextColor(Color.BLUE);
} return view;
} @Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { View view = convertView;
if(view == null){
view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item_child, parent, false);
} TextView textView = view.findViewById(R.id.tv_child); Object data = getChild(groupPosition, childPosition); textView.setText(data.toString()); if(childPosition > 1){
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
}else{
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
} return view;
} @Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
}
}

这里的数据源用的是上一个数据源,主要实现的方法是getGroupViewgetChildView,另外要注意的是,设置id的时候,为避免父元素和子元素id重复,设置父元素位置*100为其真正id,这样只要子元素不超过100个,就不会重复。

View view = convertView;
if(view == null){
view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item_group, parent, false);
}

利用这几句代码判断当前view是否需要新建,否则使用缓存

Object data = getGroup(groupPosition);

从数据源中提取相应数据

TextView textView = view.findViewById(R.id.tv_group);
textView.setText(data.toString());

并为相应的TextView设置文本

if(groupPosition % 2 == 1){
textView.setTextColor(Color.RED);
}else{
textView.setTextColor(Color.BLUE);
}

为了看出自定义效果,在这里为文本设置颜色,其中数组位置为奇数的设置红色,偶数的设置蓝色。

子元素的设置类似父元素,在子元素中只是区分字体的大小,不赘述。

效果图:

![](https://i.loli.net/2019/09/10/JqDkh9C42dob5YW.gif)

ExpandableListView之BaseExpandableListAdapter的更多相关文章

  1. 可展开的列表组件——ExpandableListView深入解析

    可展开的列表组件--ExpandableListView深入解析 一.知识点 1.ExpandableListView常用XML属性 2.ExpandableListView继承BaseExpanda ...

  2. android适配器Adapter

    一.什么是适配器,适配器有什么用? 适配器是AdapterView视图(如ListView - 列表视图控件.Gallery - 缩略图浏览器控件.GridView - 网格控件.Spinner - ...

  3. android 编程小技巧(持续中)

    first:     Intent跳转一般存用于Activity类,可是若要在非activity类里跳转的话,解决方法是在startActivity(intent)前加mContext即上下文,终于为 ...

  4. Android ExpandableListView BaseExpandableListAdapter (类似QQ分组列表)

    分组列表视图(ExpandableListView) 和ListView不同的是它是一个两级的滚动列表视图,每一个组可以展开,显示一些子项,类似于QQ列表,这些项目来至于ExpandableListA ...

  5. Android开发之ExpandableListView扩展(BaseExpandableListAdapter的使用)(完整版)

    Android开发之ExpandableListView扩展(BaseExpandableListAdapter的使用)(完整版)

  6. Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)

    之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...

  7. Android中使用ExpandableListView实现好友分组

    一个视图显示垂直滚动两级列表中的条目.这不同于列表视图,允许两个层次,类似于QQ的好友分组.要实现这个效果的整体思路为: 1.要给ExpandableListView 设置适配器,那么必须先设置数据源 ...

  8. 安卓开发树形控件之ExpandableListView(一)

    这个例子非常简单,简单到一个初学者都能随便开发出来,今天的目的仅仅只是为了将效果实现出来,如果想深入这里有几篇非常不错的博客: Android 之ExpandableListView几个特殊的属性 h ...

  9. ExpandableListView实现展开更多和收起更多

    [需求]: 如上面图示 当点开某个一级菜单的时候,其他菜单收起: 子级菜单默认最多5个: 多于5个的显示"展开更多" 点击"展开更多",展开该级所有子级菜单,同 ...

随机推荐

  1. Go-如何读取yaml,json,ini等配置文件

    1. json使用 JSON 应该比较熟悉,它是一种轻量级的数据交换格式.层次结构简洁清晰 ,易于阅读和编写,同时也易于机器解析和生成. 创建 conf.json: { "enabled&q ...

  2. Go最火的Gin框架简单入门

    Gin 介绍 Gin 是一个 Golang 写的 web 框架,具有高性能的优点,,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务.官方地址:htt ...

  3. appiumstudio工具-----实现windows上安卓、IOS自动化测试

    博主用的是win10,用python+appium做完安卓的自动化第一个版本后,大量地搜索windows上做IOS自动化的解决办法,有的建议用虚拟机,安装苹果的系统,没有实践过,据说效果不很好.然后, ...

  4. CZGL.Auth: ASP.NET Core Jwt角色授权快速配置库

    CZGL.Auth CZGL.Auth 是一个基于 Jwt 实现的快速角色授权库,ASP.Net Core 的 Identity 默认的授权是 Cookie.而 Jwt 授权只提供了基础实现和接口,需 ...

  5. Mac 打造开发工作环境

    近日公司配的dell笔记本越来越难担重任(主要是CPU太差,本人是Java开发,IDE一编译CPU就100%),于是狠下心入手了一台常规顶配Macbook Pro,现记录新本本的调教过程. Homeb ...

  6. 聊聊我在这家公司设计的SSO

    最近小明遇到一个需求:需要将几个独立的系统(子系统)汇总到一个集中的系统(父系统)当中,当用户在父系统登录过后,再点击这几个子系统,就可以免登录跳转到任意一个系统.当时一听,duang~duang~就 ...

  7. 随笔编号-15 重构--改善既有代码的设计--Day01--学习笔记

    最近公司开发的系统在进行大批量数据查询的时候发现响应速度变得让人无法忍受,so 老大安排我进行代码重构的工作,主要目的就是为提高代码的执行效率.减小方法之间的响应时间.降低方法之间的耦合度.= =! ...

  8. d3.js制作蜂巢图表带动画效果

    以上是效果图,本图表使用d3.js v4制作.图表主要功能是在六边形格子中显示数据,点击底部图标可以切换指定格子高亮显示,图表可以随浏览器任意缩放. 1.图表的主体结构是由正六边形组成,使用d3生成六 ...

  9. HTTP head请求

    GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体. PUT: 从客户端向服务器传送的数据取代指定 ...

  10. ThreadLocal可以解决并发问题吗?

    前言 到底什么是线程的不安全?为什么会存在线程的不安全?线程的不安全其实就是多个线程并发的去操作同一共享变量没用做同步所产生意料之外的结果.那是如何体现出来的呢?我们看下面的一个非常经典的例子:两个操 ...