简单的来说,它是一种用于滚动的展示的两级列表视图。也就是ListView的二级选择加强版这种。一种用于垂直滚动展示两级列表的视图,和 ListView 的不同之处就是它可以展示两级列表,分组可以单独展开显示子选项。这些选项的数据是通过 ExpandableListAdapter 关联的。

这个 ExpandableListAdapter 又是什么呢?和 ListView 使用的 BaseAdapter 差不多,都是用来给 View 提供数据、 实例化子布局的。

实现过程:


1. 创建布局

<ExpandableListViewandroid:id="@+id/frat2_expand_list"android:layout_width="match_parent"android:layout_height="match_parent"></ExpandableListView>

一级列表

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/frag2_expand_parent_item"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center_vertical"android:paddingBottom="8dp"android:paddingLeft="32dp"android:textSize="25dp"android:text="  "android:textColor="#000"tools:ignore="HardcodedText,RtlHardcoded,RtlSymmetry,SpUsage" />

二级列表

<?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="50dp"android:paddingTop="8dp"android:paddingBottom="8dp"android:orientation="horizontal"><RelativeLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"><ImageViewandroid:id="@+id/frag2_child_image"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/bus_2"android:layout_marginLeft="100dp"/><TextViewandroid:id="@+id/frag2_child_tv1"android:layout_width="wrap_content"android:layout_height="match_parent"android:text="1号(101人)"android:textSize="25sp"android:layout_toRightOf="@id/frag2_child_image"/><TextViewandroid:id="@+id/frag2_child_tv2"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_toRightOf="@id/frag2_child_tv1"android:text="5分钟到达"android:textSize="25sp"android:layout_marginLeft="50dp"/></RelativeLayout><LinearLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:gravity="center"android:layout_weight="1"><TextViewandroid:id="@+id/frag2_child_tv3"android:layout_width="wrap_content"android:layout_height="match_parent"android:text="距站台1000米"android:textSize="25sp"/></LinearLayout>
</LinearLayout>

2. 加载控件,编写要显示数据到的base类

public class Frag2_Data {private String stand;private String carCode;private String Per_num;private String time;private String distance;public Frag2_Data(String stand, String carCode, String per_num, String time, String distance) {this.stand = stand;this.carCode = carCode;Per_num = per_num;this.time = time;this.distance = distance;}public String getStand() {return stand;}public void setStand(String stand) {this.stand = stand;}public String getCarCode() {return carCode;}public void setCarCode(String carCode) {this.carCode = carCode;}public String getPer_num() {return Per_num;}public void setPer_num(String per_num) {Per_num = per_num;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}public String getDistance() {return distance;}public void setDistance(String distance) {this.distance = distance;}
}

3,设置数据

private void init(View view) {expandableListView = view.findViewById(R.id.frat2_expand_list);expandableListView.setAdapter(new Frag2_ExpandableAdapter(getContext(),maps));}
private void getData() {for (int i = 0; i <= 1; i++) {Frag2_Data frag2Data = new Frag2_Data("中医院站",(i+1)+"号","("+101+"人)",6+"分钟到达","距离站台"+(1000+i*5)+"米");map.put(i,frag2Data);}maps.put(0,map);map = new HashMap<>();for (int i = 0; i <= 1; i++) {Frag2_Data frag2Data = new Frag2_Data("联想大厦站",(i+1)+"号","("+101+"人)",6+"分钟到达","距离站台"+(8000-i*8)+"米");map.put(i,frag2Data);}maps.put(1,map);
}

设置了两个Map,map里面存的是 对象,第二个maps里面存的是第一个map,这每个maps里面的map都对应着一个 数据项.


4,设置适配器

package com.mad.trafficclient.adapter;import android.annotation.SuppressLint;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;
import com.mad.trafficclient.R;
import com.mad.trafficclient.base.Frag2_Data;
import java.util.Map;public class Frag2_ExpandableAdapter extends BaseExpandableListAdapter {private Context context ;Map<Integer,Map<Integer,Frag2_Data> > maps;Map<Integer,Frag2_Data> map ;public Frag2_ExpandableAdapter(Context context, Map<Integer,Map<Integer,Frag2_Data>> maps){this.maps = maps;}//获取分组的个数@Overridepublic int getGroupCount() {return maps.size();}//获取分组中每个子选项的 个数@Overridepublic int getChildrenCount(int groupPosition) {return maps.get(groupPosition).size();}//获取指定分组的数据@Overridepublic Object getGroup(int groupPosition) {return maps.get(groupPosition);}//获取指定分组的指定子选项数据@Overridepublic Object getChild(int groupPosition, int childPosition) {return maps.get(groupPosition).get(childPosition);}//获取指定分组的ID,这个ID必须是唯一的@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}//获取子选项的ID ,这个ID必须是唯一的@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}//分组和子选项 是否持有稳定的ID,就是说底层数据的改变会不会影响他们@Overridepublic boolean hasStableIds() {return true;}/***获取显示指定组 的视图对象* @param groupPosition 组的位置* @param isExpanded 该组是展开还是伸缩状态* @param convertView 重用已有的 视图对象* @param parent 返回的视图对象始终依附于 的视图组* @return 返回View*///获取显示指定分组的 视图@Overridepublic View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {if (convertView == null){convertView = View.inflate(parent.getContext(), R.layout.frag2_expand_partent_item,null);}TextView textView = convertView.findViewById(R.id.frag2_expand_parent_item);textView.setText(maps.get(groupPosition).get(0).getStand());return convertView;}/***获取一个视图对象,显示指定组中的指定元素数据* @param groupPosition 组的位置* @param childPosition 子元素的位置* @param isLastChild  子元素是否处于组中的最后一个* @param convertView 重用已有的视图View* @param parent 返回的视图对象始终依附于视图组* @return 返回View*/
//  获取的显示给定分组给定子位置的数据用的视图@SuppressLint("SetTextI18n")@Overridepublic View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {map = maps.get(groupPosition);if (convertView == null){convertView = View.inflate(parent.getContext(),R.layout.frag2_expandable_child_item,null);}TextView tv1 = convertView.findViewById(R.id.frag2_child_tv1);TextView tv2 = convertView.findViewById(R.id.frag2_child_tv2);TextView tv3 = convertView.findViewById(R.id.frag2_child_tv3);tv1.setText(map.get(childPosition).getCarCode()+""+map.get(childPosition).getPer_num());tv2.setText(map.get(childPosition).getTime());tv3.setText(map.get(childPosition).getDistance());return convertView;}//指定位置上的子元素 是否可选中@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return true;}
}

适配器里面方法的作用已经加了注释。其实不难理解。主要就是给适配器传递数据的时候,一定要注意设置数据的方式。每一个标题对应着好几个子选项。我装数据的方式是使用两个map集合,先把子选项据的数据装好,然后把这个map集合给第二个maps。第二个maps里面对应着多个map.这样一个maps里面装的每个map就对应着一个子选项。

效果如下:

当然了,装数据也有好多种办法。这里就看你自己的习惯了。

如有错误,还请指出,谢谢!

ExpandableListView 的使用相关推荐

  1. 使用ExpandableListView以及如何优化view的显示减少内存占用

    上篇博客讲到如何获取手机中所有歌曲的信息.本文就把上篇获取到的歌曲按照歌手名字分类.用一个ExpandableListView显示出来. MainActivity .java public class ...

  2. android二级列表展开,ExpandableListView控件实现二级列表

    效果图如下: 二级列表附有点击事件. 1.布局文件: 此处加了一个自定义的导航RelativeLayout,记得注activity的时候添加 android:theme="@style/Th ...

  3. ExpandableListView(一)替换系统默认的箭头

    很多朋友可能在android开发中,用过ExpandableListView这个组件,这个组件功能强大,比传统的ListView有好多优势.然而在开发中,我相信有好多人,包括我个人都会遇到下面的一些问 ...

  4. ExpandableListView的使用以及信息的高亮显示

    ExpandableListView是ListView控件的延伸,它能够对数据进行分组显示和隐藏,并统计总数量.可进行滚动,对某一内容高亮显示. <1>编写xml布局文件,用于获取Expa ...

  5. ExpandableListView 里面嵌套GridView实现高度自适应

    很早之前做过一个商城的app 也是第一次做安卓. 实现的效果如下: 因为一开始做安卓,很多写的代码都不规范,在下面上代码的地方,还请高手指点(勿喷,楼主是自尊心很强的屌丝) 这个效果要解决2个大问题, ...

  6. Android中ExpandableListView的使用

    Android中ExpandableListView的使用 ExpandableListView是Android中可以实现下拉list的一个控件,具体的实现方法如下: 首先:在layout的xml文件 ...

  7. 替换ExpandableListView右边箭头Group Indicator(小图标)

     先在drawable目录下建立xml文件: <?xml version="1.0" encoding="utf-8"?> <select ...

  8. android 中使用ExpandableListView控件结合服务器json文件的下载

    布局文件代码: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns ...

  9. android 之ExpandableListView详解

    ExpandableListView是一种可应用于某种环境的下拉列表. 实例代码: package com.example.lenovo.expandablelistview_demo;import ...

  10. UI组件之AdapterView及其子类(六)ExpandableListView组件和ExpandableListActivity的使用

    ExpandableListView是ListView的子类,他在ListView上进行了扩展,它把列表项分成了几组,每组里包含了多个列表项 ExpandableListView的列表项是由Expan ...

最新文章

  1. 中jsp加载不出来layui_为何渔具厂生产不出来钓鱼人理想中的鱼竿呢,厂家说臣妾做不到啊...
  2. Linux系统普通用户切换省略输入用户名密码
  3. linux c sysconf函数 得到系统配置
  4. 放授权代码的php文件夹,自己的项目如果包含别人的开源代码,licence文件应放在哪里...
  5. Vue中使用Openlayers加载Geoserver发布的ImageWMS
  6. html 新append后的元素如何注册click
  7. anki模板_梁宝川:如何导入,导出anki笔记?
  8. python代码实现文件复制txt文件_工具类(1.1)
  9. POJ2356 Find a multiple 鸽巢原理
  10. 如不指定存储类型c语言,总结C语言的五种存储类型
  11. 英文网站源码 国外财经资讯商业新闻整站源码 全自动采集发布 广告联盟网站
  12. 国内硕士申请加拿大计算机博士难度,加拿大硕士和博士真的那么难申请吗?
  13. react-custom-scrollbars样式
  14. 在Chrome浏览器中点击链接,打开IE浏览器,跳转到指定页面并传递参数
  15. 新疆旅游攻略-可可托海
  16. 专注要事、把手弄脏、高效优雅是对抗规模化焦虑的好办法--读Getting Real(达成现实)和 Rework(重塑工作)
  17. 计算机开机后无法网络拨号怎样处理,拨号上网时电脑假死的原因和解决方法
  18. 基于ArcGIS水文分析、HEC-RAS模拟技术在洪水危险性及风险评估
  19. [Jupyter Notebook]导出好看的中文PDF
  20. Feature Selection详解(附带Relief、Relief-F、LVM详解)(一)

热门文章

  1. 解决NintendoSwitch安装SXPro后开机长期蓝屏问题
  2. MPEG4标准中的Advanced Simple Profile(ASP)完整的说明-01-02章
  3. 【硬件通信协议】2. 详细解析SPI通信协议(标准4线SPI)
  4. Java将数字金额转换为中文大写
  5. excel linux时间戳转换成日期,Excel将Unix时间戳转换为日期
  6. 毕业季海报设计素材图片大全,送给毕业生们最好的毕业季祝福语文案
  7. python语法糖是什么意思_Python中的甜蜜语法糖,甜甜的
  8. 家长进课堂 计算机ppt,小学生家长进课堂ppt
  9. 混合线性模型学习笔记2
  10. 海外手机号码格式校验(PHP版)