Android ExpandableListView

分享到:

ExpandableListView也是一种列表控件和前面讲过的ListView有些相似,不同点在于ExpandableListView可以实现像QQ好友列表分组点击收起再点击展开的效果,文档最后给出了一个实例可供参考。

ExpandableListView的重要方法:

public abstract ObjectgetChild (int groupPosition, int childPosition)
取得与指定分组、指定子项目关联的数据.

参数
groupPosition 包含子视图的分组的位置.
childPosition   指定的分组中的子视图的位置.

返回
与子视图关联的数据

public abstract long getChildId (int groupPosition, intchildPosition)
取得给定分组中给定子视图的ID. 该组ID必须在组中是唯一的.必须不同于其他所有ID(分组及子项目的ID).

参数
groupPosition 包含子视图的分组的位置.
childPosition   要取得ID的指定的分组中的子视图的位置.

返回
与子视图关联的ID.

public abstract View getChildView (int groupPosition, intchildPosition, boolean isLastChild, View convertView, ViewGroup parent)
取得显示给定分组给定子位置的数据用的视图.

参数
groupPosition 包含要取得子视图的分组位置.
childPosition   分组中子视图(要返回的视图)的位置.
isLastChild     该视图是否为组中的最后一个视图.
convertView   如果可能,重用旧的视图对象.使用前你应该保证视图对象为非空,并且是否是合适的类型.如果该对象不能转换为可以正确显示数据的视图,该方法就创建新视图.不保证使用先前由 getChildView(int, int,boolean, View, ViewGroup)创建的视图.
parent     该视图最终从属的父视图.

返回
指定位置相应的子视图.

public abstract int getChildrenCount (int groupPosition)
取得指定分组的子元素数.

参数
groupPosition 要取得子元素个数的分组位置.

返回
指定分组的子元素个数

public abstract long getCombinedChildId (long groupId, long childId)
取得一览中可以唯一识别子条目的 ID(包括分组ID和子条目ID).可扩展列表要求每个条目 (分组条目和子条目)具有一个可以唯一识别列表中子条目和分组条目的ID. 该方法根据给定子条目ID和分组条目ID返回唯一识别ID.另外,如果 hasStableIds() 为真,该函数返回的ID必须是固定不变的.

参数
groupId   包含子条目ID的分组条目ID.
childId    子条目的ID.

返回
可以在所有分组条目和子条目中唯一识别该子条目的ID(可能是固定不变的)

public abstract long getCombinedGroupId (long groupId)
取得一览中可以唯一识别子条目的 ID(包括分组ID和子条目ID).可扩展列表要求每个条目 (分组条目和子条目)具有一个可以唯一识别列表中子条目和分组条目的ID. 该方法根据给定子条目ID和分组条目ID返回唯一识别ID.另外,如果 hasStableIds() 为真,该函数返回的ID必须是固定不变的.

参数
groupId   分组条目ID.

返回
可以在所有分组条目和子条目中唯一识别该分组条目的ID(可能是固定不变的).

public abstract Object getGroup (int groupPosition)
取得与给定分组关联的数据.

参数
groupPosition 分组的位置.

返回
指定分组的数据.

public abstract int getGroupCount ()
取得分组数.

返回
分组数.

public abstract long getGroupId (int groupPosition)
取得指定分组的ID.该组ID必须在组中是唯一的.必须不同于其他所有ID(分组及子项目的ID).

参数
groupPosition 要取得ID的分组位置.

返回
与分组关联的ID.

public abstract View getGroupView (int groupPosition, booleanisExpanded, View convertView, ViewGroup parent)
取得用于显示给定分组的视图. 这个方法仅返回分组的视图对象, 要想获取子元素的视图对象,就需要调用 getChildView(int, int, boolean, View, ViewGroup).

参数
groupPosition 决定返回哪个视图的组位置 .
isExpanded     该组是展开状态还是收起状态 .
convertView   如果可能,重用旧的视图对象.使用前你应该保证视图对象为非空,并且是否是合适的类型.如果该对象不能转换为可以正确显示数据的视图,该方法就创建新视图.不保证使用先前由 getGroupView(int, boolean,View, ViewGroup)创建的视图.
parent     该视图最终从属的父视图.

返回
指定位置相应的组视图.

public abstract boolean hasStableIds ()
是否指定分组视图及其子视图的ID对应的后台数据改变也会保持该ID.

返回
是否相同的ID总是指向同一个对象.

public abstract boolean isChildSelectable (int groupPosition, intchildPosition)
指定位置的子视图是否可选择.

参数
groupPosition 包含要取得子视图的分组位置.
childPosition   分组中子视图的位置.

返回
是否子视图可选择

ExpandableListView实例(源码来自网络):

MXL布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<ExpandableListView
android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawSelectorOnTop="false"/>
</LinearLayout>

java代码:

package com.kongjian.expandablelistview;

import java.util.ArrayList;
import java.util.List;
import android.app.ExpandableListActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

public class ContactsActivity extends ExpandableListActivity {
          
          List<String> group;           //组列表
          List<List<String>> child;     //子列表
          ContactsInfoAdapter adapter;  //数据适配器
  
          /** Called when the activity is first created. */
          @Override
          public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          requestWindowFeature(Window.FEATURE_NO_TITLE);  //设置为无标题
          setContentView(R.layout.main);
          getExpandableListView().setBackgroundResource(R.drawable.default_bg);
  
          initializeData();
          getExpandableListView().setAdapter(new ContactsInfoAdapter());
          getExpandableListView().setCacheColorHint(0);  //设置拖动列表的时候防止出现黑色背景
          }
  
          /**
          * 初始化组、子列表数据
          */
          private void initializeData(){
          group = new ArrayList<String>();
          child = new ArrayList<List<String>>();
  
          addInfo("Andy",new String[]{"male","138123***","GuangZhou"});
          addInfo("Fairy",new String[]{"female","138123***","GuangZhou"});
          addInfo("Jerry",new String[]{"male","138123***","ShenZhen"});
          addInfo("Tom",new String[]{"female","138123***","ShangHai"});
          addInfo("Bill",new String[]{"male","138231***","ZhanJiang"});
  
          }
  
          /**
          * 模拟给组、子列表添加数据
          * @param g-group
          * @param c-child
          */
          private void addInfo(String g,String[] c){
          group.add(g);
          List<String> childitem = new ArrayList<String>();
          for(int i=0;i<c.length;i++){
          childitem.add(c[i]);
          }
          child.add(childitem);
          }
  
          class ContactsInfoAdapter extends BaseExpandableListAdapter{
         
          //-----------------Child----------------//
          @Override
          public Object getChild(int groupPosition, int childPosition) {
          return child.get(groupPosition).get(childPosition);
          }
  
          @Override
          public long getChildId(int groupPosition, int childPosition) {
          return childPosition;
          }
  
          @Override
          public int getChildrenCount(int groupPosition) {
          return child.get(groupPosition).size();
          }
  
          @Override
          public View getChildView(int groupPosition, int childPosition,
          boolean isLastChild, View convertView, ViewGroup parent) {
          String string = child.get(groupPosition).get(childPosition); 
          return getGenericView(string);
          }
  
          //----------------Group----------------//
          @Override
          public Object getGroup(int groupPosition) {
          return group.get(groupPosition);
          } 
         @Override
          public long getGroupId(int groupPosition) {
          return groupPosition;
          } 
  
          @Override
          public int getGroupCount() {
          return group.size();
          } 
  
          @Override
          public View getGroupView(int groupPosition, boolean isExpanded,
          View convertView, ViewGroup parent) {
          String string = group.get(groupPosition); 
          return getGenericView(string);
          }
         //创建组/子视图 
          public TextView getGenericView(String s) { 
          // Layout parameters for the ExpandableListView 
          AbsListView.LayoutParams lp = new AbsListView.LayoutParams( 
          ViewGroup.LayoutParams.FILL_PARENT, 40);
  
          TextView text = new TextView(ContactsActivity.this); 
          text.setLayoutParams(lp); 
          // Center the text vertically 
          text.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); 
          // Set the text starting position 
          text.setPadding(36, 0, 0, 0); 
  
          text.setText(s); 
          return text; 
          } 
  
  
          @Override
          public boolean hasStableIds() {
          // TODO Auto-generated method stub
          return false;
          } 
         @Override
          public boolean isChildSelectable(int groupPosition, int childPosition) {
          // TODO Auto-generated method stub
          return true;
          }
  
          }
}

运行效果如下图:

本例演示了ExpandableListView控件最基本的使用方法,可以看出和ListView大体相同,同样需要ArrayList做为数据源,同样需要Adapter来绑定数据,ExpandableListView非常适合用来开发分类目录。

昵    称:
验证码:

相关文档:

Android控件
Android基础知识
Android组件
Android实例