ExpandableListView 控件提供的是一个多级列表(一般是两级)。但是如何实现这个两级列表呢?既然ExpandableListView 采用列表的形式,它也应该有一个适配器,但是它的适配器不是继承BaseAdapter ,而是要继承它独有的适配器BaseExpandableListAdapter ,同时也需要实现其中的几个方法,如表4.3 所示。

      表4.3 BaseExpandableListAdapter中的方法

方法名称参数说明
getGroupIdint groupPosition *获取组在给定的位置编号
getChildldint groupPosition,int childPosition获取给定组的孩子的ID
getGroupCount
获取第一级列表的列数
getChildrenCountint groupPosition获取指定组中孩子的数量
getGroupint groupPosition获取给定组相关的数据
getGroupViewint groupPosition,boolean isExpanded,View convertView,
  ViewGroup父级
获取一个显示的视图给定组
getChildint groupPosition,int childPosition获取与孩子在给定的组相关的数据
getChildViewint groupPosition,int子位置,boolean isLastChild,View
  convertView,ViewGroup父级
获取一个视图显示在给定的组的孩子的数据

  表4.3简单地介绍了BaseExpandableListAdapter中的方法。

  (1)布局文件。从图中可以研磨我们需要用到3个布局文件:一个是声明ExpandableListView ,一个声明第一级菜单,一个是第二级菜单的布局文件。声明ExpandableListView的布局文件;

<?xm

<RelativeLayout xmlns:android =“ http://schemas.android.com/apk/res/android”

android:orientation =“ vertical” android:layout ^ width ^“ fill_parent”

android:layout_height = -nfill_paren t“  –

androidibackground ^’^ drawable / default-bg’^

<ExpandableListView android:id =“ @ + id / list”

android:layout_width = nfill_parent“

android:layout_height =“ fill_parent”

android:layout_alignParentLeft =“ true” />

一― </ Re丄

第一级菜单布局文件:

<?xml version =“ 1.0 n encoding =” ut f-8’*?>’  *

<LinearLayout xmlns:android =“ http://schemas.android.com/apk/res/android”

android:layout_wid

android:layout_height = n40dipH

android:layout_gravity =,“ center_horizo​​ntal”>

<LinearLayout

android:id =“ @ + id / layout_013H

android:layout_width = nfill_parent“

android:layout ^ height ^’MOdip“

android:orientation =水平”>

<ImageView

android:id-1’@ + id / ImageViewO 1”

android:layout_width =’,wrap_con tent”

android:layout_height =“ wrap_content”

android:gravity ^^ center ^ vertical“

android:paddingTop ^“ 1Odip”

android:src = n @ drawable / user_group“>

</ ImageView>

<RelativeLayout

android:id =“ @ + id / layout_013”

android:layout_width =“ wrap„ content”

android:layout_height =“ wrap„ content”>

<TextView

android:id =“ @ + id / conten00丄”

android:layout_width =“ wrap_content”

android:layout_height = nfill__parent”

android:layout_gravity = Hcenter-垂直”

android:gravity =“ center_vertical”

安卓 :paddingLeft = ,, 10pxn

android:textColor =’^ FFFFFF“

android:textSize =“ 26px”>

</ TextView>

<lmageView

android:id- ^ Q + id / tubiao11

android:layout_width-nwrap_content“

android:layout_height =“ wrap_content”

android:layout_alignParentRight = ,, true *’>

</ ImageView>

</ RelativeLayout>

</ LinearLayout>

第二级菜单布局文件:

<?xml version = nl.0“ encoding =” utf-8n?>

<LinearLayout xmlns:android =“ http://schemas.android.com/apk/res/android”

android:id-“ @ + id / childlayout”

android:layout_width二

android:layout_height-“ fill ^ arent *”

android:orientation =“ horizo​​ntai”>

<ImageView

android:id = ,, @ + id / child_image,’

android:layout_width =“ wrap_content”

android:layout_height =“ wrap_contentn

android:layout_marginLeft = n 40dip“

android:background =“ @ dr awable / chi ld_image *’

android:paddingTop =“ lOdip”>

</ ImageView>

<LinearLayout

android:layout_width =,“ wrap_content”

android:layout_he ight =“ w rap_content”

android:orientation =“ vertical”>

<TextView

android:id-‘* @ + id / child_text,’

android:layout ^ widthiwrap-内容”

android:layout_height-nwrap„ content“

android:layout_gravity =“ center_vertical”

android:gravity = ncenter_vertical“

android:text =,1 n

android:textSize =” 16dip”>

</ TextView>

<TextView

android:id =” @ + id / child_text2’T

android:layout_width = nwrap_content”

android:layout_height!=“ wrap_content”

android:layout_gravity = ,,, center_vertical“

android:gravity =“ center_verticaln

android:text-H“

android:textSize =“ 12dip”>

</ TextView>

</ LinearLayout>

</ LinearLayout>

  (2)写一个类ExAdapter继承BaseExpandableListAdapter,并且实现它的方法。获取给定组的一个显示的视图:

//荻取一个显示的视图给定组

public View getGroupView(int groupPosition,boolean isExpandedz

查看convertView,父级为ViewGroup的{

视图视图= convertView;

if(view == null){

// /通过getSystemService方法实例化一个视图的填充器

LayoutInflater inflater =(LayoutXnflater)getSystemServiue

(上下文。LAYOUT_INFLATER_SERVICE);

view = inflater.inflate(R.layout.mQmber_listview,null);

}

Textview标题=(Textview)view.findViewByld

(R.id.content_001);

title.setText(getGroup(groupPosition).toString());

ImageView image =(ImageView)view.findViewByld(R.id.tubiao);

//判断实例可以展开,如果可以则改变右侧的图标

如果(isExpanded)

image.setBackgroundResource(R ・ drawable.btn_browser2);

else image.setBackgroundResource(R.drawable.btn_browser); 

返回视图

获取给定组的相关数据及显示的列数:

//获取给定组相关的数据

公共对象getGroup(int groupPosition){

返回groupData.get(groupPosition).get(G_TEXT).toStringf);

}

//获取第一级列表的列数

publie int getGroupCount(){

返回groupData.size();

获取一个视图显示在给定的组的孩子的数据:

公共视图getChildView(int groupPosition,int childPosition,

boolean isLastChild,View convertview,ViewGroup parent){

视图视图= convertview;

if(view == null){

//填充视图

LayoutInflater inflater =(LayoutInflater)getSystemService

(Context.LAYOUT_INFLATER_SERVICE);

视图-inflater.inflate(R.layout.member_childitem,null);

}

最终的Textview标题-(Textview)view.fIndViewByld

(R.id.child„ text);

标题・ setText(childData.get(groupPosition)。

get(子位置).get(C_TEXT1).toStringO);

最终的Textview title2 =(TextView)view.findViewByld

(R.id.child„ text2);

title2.setText(childData.get(groupPosition)。

get(childPosition).get(C_TEXT2).toString());

返回视图

获取与孩子在给定的组相关的数据,以及孩子组显示的列数:

//获取与孩子在给定的组相关的数据

pub Objectic Object getChild(int groupPosition,in七childPosition){

返回

childData.get(groupPosition).get(childPosition).ge七(C_ * TEXT1).toString();

}

//获取指定组中孩子的数量

public int getChildrenCount(int groupPosition){

返回childData ・ get(groupPosition),size();

}

  (3)通过方法findViewByld获取ExpandableListView的实例,从而设置数据显示的适配器。

for(int i = 0; i <5; i ++){

Map <String,String> curGroupMap-新的HashMap <String,String>();

groupData.add(curGroupMap);

curGroupMap.put(G_TEXT,“组” + i);

Lis txMQpcString,St环»子代=新的ArrayLis tSapcString,

字符串»();

for(int j = 0; j <5; j ++){

Map <Stringr String> curChildMap = new HashMap <Stringz String>();

children.add(curChildMap);

curChildMap.put(C_TEXT1,“ Child” + j);

curChildMap.put(C_TEXT2,“ Child” + j); 

childData.add(children);

}

adapter ^ new ExAdapter(ExpanListViewDemoActivity.this);

exList =(ExpandableListView)findViewByld(R.id.list);

exList.setAdapter(adapter);

exList。“ tGroiip工ndicatoEfnull);

-exList。setDividg“ nulJj”;

  从这个实例中可以看到,ExpandableListView的功能主要在于它的适配器,只要写好了适配器,列表就会显示出来。上面的例子中,我们没有添加,排名第二级列表不会有任何反应,如果要有点击的效果,需要为ExpandableListView设置一个事件:setOnChildClickListener,实例化OnChildClickListener类,实现其中的公共布尔onChildClick(ExpandableListViewparent,视图v,INT groupPosition,INT childPosition,长ID)方法,这个事件就留给读者去实现。