(一)概述

本节要讲解的Adapter类控件是ExpandableListView,就是可折叠的列表,它是
ListView的子类,
在ListView的基础上它把应用中的列表项分为几组,每组里又可包含多个列表项。至于
样子,
类似于QQ联系人列表,他的用法与ListView非常相似,只是ExpandableListVivew显示
的列表项
需由ExpandableAdapter提供。 下面我们来学习这个控件的基本使用!

(二)相关属性

android:childDivider:指定各组内子类表项之间的分隔条,图片不会完全显示,
分离子列表项的是一条直线
android:childIndicator:显示在子列表旁边的Drawable对象,可以是一个图像
android:childIndicatorEnd:子列表项指示符的结束约束位置
android:childIndicatorLeft:子列表项指示符的左边约束位置
android:childIndicatorRight:子列表项指示符的右边约束位置
android:childIndicatorStart:子列表项指示符的开始约束位置
android:groupIndicator:显示在组列表旁边的Drawable对象,可以是一个图像android:indicatorEnd:组列表项指示器的结束约束位置
android:indicatorLeft:组列表项指示器的左边约束位置
android:indicatorRight:组列表项指示器的右边约束位置
android:indicatorStart:组列表项指示器的开始约束位置
2.实现ExpandableAdapter的三种方式
1. 扩展BaseExpandableListAdpter实现ExpandableAdapter。
2. 使用SimpleExpandableListAdpater将两个List集合包装成ExpandableAdapter
3. 使用simpleCursorTreeAdapter将Cursor中的数据包装成SimpleCuroTreeAdapter
本节示例使用的是第一个,扩展BaseExpandableListAdpter,我们需要重写该类中的相
关方法,
下面我们通过一个代码示例来体验下!
3.代码示例
我们来看下实现的效果图:

下面我们就来实现上图的这个效果:
核心是重写BaseExpandableListAdpter,其实和之前写的普通的BaseAdapter是类似的,
但是BaseExpandableListAdpter则分成了两部分:组和子列表,具体看代码你就知道了!
另外,有一点要注意的是,重写isChildSelectable()方法需要返回true,不然不会触发
子Item的点击事件!下面我们来写写:
首先是组和子列表的布局:
item_exlist_group.xml:

<?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="match_parent"android:orientation="horizontal"android:padding="5dp"><TextView
        android:id="@+id/tv_group_name"android:layout_width="match_parent"android:layout_height="56dp"android:gravity="center_vertical"android:paddingLeft="30dp"android:text="AP"android:textStyle="bold"android:textSize="20sp" /></LinearLayout>

item_exlist_item.xml:

<?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="match_parent"android:orientation="horizontal"android:padding="5dp"android:background="#6BBA79"><ImageView
        android:id="@+id/img_icon"android:layout_width="48dp"android:layout_height="48dp"android:src="@mipmap/iv_lol_icon1"android:focusable="false"/><TextView
        android:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:layout_marginTop="15dp"android:focusable="false"android:text="提莫"android:textSize="18sp" /></LinearLayout>

然后是自定义的Adapter类:
MyBaseExpandableListAdapter.java:

package jay.com.expandablelistviewdemo;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 java.util.ArrayList;public class MyBaseExpandableListAdapter extends BaseExpandableListAdapter {private ArrayList<Group> gData;private ArrayList<ArrayList<Item>> iData;private Context mContext;public MyBaseExpandableListAdapter(ArrayList<Group> gData,ArrayList<ArrayList<Item>> iData, Context mContext) {this.gData = gData;this.iData = iData;this.mContext = mContext;}@Overridepublic int getGroupCount() {return gData.size();}@Overridepublic int getChildrenCount(int groupPosition) {return iData.get(groupPosition).size();}@Overridepublic Group getGroup(int groupPosition) {return gData.get(groupPosition);}@Overridepublic Item getChild(int groupPosition, int childPosition) {return iData.get(groupPosition).get(childPosition);}@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}@Overridepublic boolean hasStableIds() {return false;}//取得用于显示给定分组的视图. 这个方法仅返回分组的视图对象@Overridepublic View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {ViewHolderGroup groupHolder;if(convertView == null){convertView = LayoutInflater.from(mContext).inflate(R.layout.item_exlist_group, parent, false);groupHolder = new ViewHolderGroup();groupHolder.tv_group_name = (TextView) convertView.findViewById(R.id.tv_group_name);convertView.setTag(groupHolder);}else{groupHolder = (ViewHolderGroup) convertView.getTag();}groupHolder.tv_group_name.setText(gData.get(groupPosition).getgName());return convertView;}//取得显示给定分组给定子位置的数据用的视图@Overridepublic View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {ViewHolderItem itemHolder;if(convertView == null){convertView = LayoutInflater.from(mContext).inflate(R.layout.item_exlist_item, parent, false);itemHolder = new ViewHolderItem();itemHolder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);itemHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);convertView.setTag(itemHolder);}else{itemHolder = (ViewHolderItem) convertView.getTag();}itemHolder.img_icon.setImageResource(iData.get(groupPosition).get(childPosition).getiId());itemHolder.tv_name.setText(iData.get(groupPosition).get(childPosition).getiName());return convertView;}//设置子列表是否可选中@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return true;}private static class ViewHolderGroup{private TextView tv_group_name;}private static class ViewHolderItem{private ImageView img_icon;private TextView tv_name;}}

PS:存储子列表的数据不一定要用ArrayList>这种,根据自己的需求
定义~
最后是MainActivity的布局以及Java代码:
布局文件:activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="5dp"tools:context=".MainActivity"><ExpandableListView
        android:id="@+id/exlist_lol"android:layout_width="match_parent"android:layout_height="match_parent"android:childDivider="#E02D2F"/></RelativeLayout>

MainActivity.java

public class MainActivity extends Activity {private ArrayList<Group> gData = null;private ArrayList<ArrayList<Item>> iData = null;private ArrayList<Item> lData = null;private Context mContext;private ExpandableListView exlist_lol;private MyBaseExpandableListAdapter myAdapter = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext = MainActivity.this;exlist_lol = (ExpandableListView) findViewById(R.id.exlist_lol);//数据准备gData = new ArrayList<Group>();iData = new ArrayList<ArrayList<Item>>();gData.add(new Group("AD"));gData.add(new Group("AP"));gData.add(new Group("TANK"));lData = new ArrayList<Item>();//AD组lData.add(new Item(R.drawable.iv_lol_icon3,"剑圣"));lData.add(new Item(R.drawable.iv_lol_icon4,"德莱文"));lData.add(new Item(R.drawable.iv_lol_icon13,"男枪"));lData.add(new Item(R.drawable.iv_lol_icon14,"韦鲁斯"));iData.add(lData);//AP组lData = new ArrayList<Item>();lData.add(new Item(R.drawable.iv_lol_icon1, "提莫"));lData.add(new Item(R.drawable.iv_lol_icon7, "安妮"));lData.add(new Item(R.drawable.iv_lol_icon8, "天使"));lData.add(new Item(R.drawable.iv_lol_icon9, "泽拉斯"));lData.add(new Item(R.drawable.iv_lol_icon11, "狐狸"));iData.add(lData);//TANK组lData = new ArrayList<Item>();lData.add(new Item(R.drawable.iv_lol_icon2, "诺手"));lData.add(new Item(R.drawable.iv_lol_icon5, "德邦"));lData.add(new Item(R.drawable.iv_lol_icon6, "奥拉夫"));lData.add(new Item(R.drawable.iv_lol_icon10, "龙女"));lData.add(new Item(R.drawable.iv_lol_icon12, "狗熊"));iData.add(lData);myAdapter = new MyBaseExpandableListAdapter(gData,iData,mContext);exlist_lol.setAdapter(myAdapter);//为列表设置点击事件exlist_lol.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {@Overridepublic boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {Toast.makeText(mContext, "你点击了:" + iData.get(groupPosition).get(childPosition).getiName(), Toast.LENGTH_SHORT).show();return true;}});}
}

<完>

Adapter类控件使用之ExpandableList(可折叠式列表)的基本使用相关推荐

  1. android自己定义刷新类控件

    android尽管定义了种类很丰富的控件.可是有的时候这些自己定义的控件还是不能满足我的要求,为了可以适配很多其它的需求,我们须要在原有的基础上进行自己定义控件. 今天我向大家介绍的就是android ...

  2. 八、pyqt5按钮类控件——QPushButton、QRadioButton、QCheckBox

    pyqt5中常用的按钮类控件有QPushButton.QRadioButton.QCheckBox.QToolButton等.这些按钮类的基类都是QAbstracButton类.所以这些类有部分方法是 ...

  3. kettle中java组件_kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件

    该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...

  4. 驰骋工作流引擎表单设计控件-字段类控件(2)

    2019独角兽企业重金招聘Python工程师标准>>> Technorati Tags: 开源工作流引擎, 驰骋.net工作流引擎, 开源表单引擎, ccform, ccflow, ...

  5. 07.移动先行之谁主沉浮----控件之轮流轰炸——布局类控件

    如果移动方向有任何问题请参考===> 异常处理汇总-移动系列(点) 移动先行之谁主沉浮? 带着你的Net飞奔吧! 链接======>(点) 一.布局类控件 Grid.StackPanel. ...

  6. C#:C#控件系列四(列表类控件)

    列表类控件 1. ListBox 控件: ListBox控件又称列表框,它在工具箱中的图标为,它显示一个项目列表供用户选择. 在列表框中,用户一次可以选择一项,也可以选择多项. 1.1. 常用属性: ...

  7. Chip类控件(Chip、InputChip、ChoiceChip、FilterChip、ActionChip)

    RawChip Material风格标签控件,此控件是其他标签控件的基类,通常情况下,不会直接创建此控件,而是使用如下控件: Chip InputChip ChoiceChip FilterChip ...

  8. C#--窗体控件(选择类控件)

    文章目录 下拉组合框控件 复选框控件 单选按钮控件 数值选择控件 选择类控件有下拉组合框(ComboBox)控件.复选框(CheckBox)控件.单选按钮(RadioButton)控件.数值选择(Nu ...

  9. 转载几篇别人写的皮肤类控件的技术文章

    转载几篇别人写的皮肤类控件的技术文章 原连接:http://blog.sina.com.cn/s/blog_4c3538470100ezhu.html 实现控件的透明背景 很多情况下,我们需要控件 的 ...

最新文章

  1. 常见网络命令介绍及使用
  2. Runtime类及其常用方法
  3. MongoDB 命令速查表
  4. ASP.NET MVC中在Action获取提交的表单数据方法总结 (4种方法,转载备忘)
  5. lammps计算聚合物例子_LAMMPS模拟聚合物结构,非晶态聚合物变形行为的模拟,纳米线变形模拟,单轴张力模拟,晶格参数计算...
  6. linux音频驱动程序测试,Linux声卡驱动移植和测试
  7. jupyter notebook中matplotlib inline 关闭或打开
  8. 可折叠的 iPhone 要来了?
  9. 新手学堂之有刷/无刷动力电调与马达知识
  10. 艾宾浩斯曲线在线 PDF 文件生成 在线背单词 背单词计划表 高考-四级-六级-SAT-托福-雅思-GRE-17 天搞定 GRE 单词, 背单词神器-动态生成时间表! 利用艾宾浩斯记忆曲线自动生成背单
  11. ideaIU--2018.2.2安装教程
  12. 32位版本的轻量级linux,适用于旧计算机的10种最佳轻量级Linux发行版
  13. 总结一下关于扫描电子显微镜与背散射电子探测器
  14. java 30分钟_java 当前时间加减30分钟的时间
  15. RPA助你一键轻松完成财务报表
  16. Android APP连接 MySQL
  17. shell 99乘法口诀表
  18. 免费网络硬盘、FTP、大容量邮箱、电子相册合集
  19. Hadoop -- hadoop介绍
  20. oracle failed login count metric,Oracle Life: SQL.PLSQL Archives - 云和恩墨,成就所托!

热门文章

  1. 华为手机预防丢失和丢失后怎么办?
  2. 萌娘百科 java_Re:萌娘百科上的黑幕实现
  3. 数据分析中的Excel、R、Python、SPSS、SAS和SQL
  4. java读取通达信day_c#读取通达信历史数据的方法
  5. JavaScript:异步函数
  6. 数组API 栈与队列方法
  7. 异常错误-Table configuration with catalog null, schema null, and table “表”did not resolve to any
  8. Pycharm文件打开方式
  9. 【跳上车子离开伤心的北京】北漂4年后,我选择回到二线城市当条“闲鱼”
  10. Android 下载apk包并安装