<span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif; white-space: pre-wrap;">一:</span>
下图为ExpandableListVivew支持的xml属性
XML Attributes | |||||||||||||||||||||
属性名 | Related Method | 描述 | |||||||||||||||||||
android:childDivider | 指定各组内子类表项之间的分隔条 ① | ||||||||||||||||||||
android:childIndicator | 显示在子列表旁边的Drawable对象② | ||||||||||||||||||||
android:childIndicatorLeft | 子列表项指示符的左边约束位置③ | ||||||||||||||||||||
android:childIndicatorRight | 子列表项指示符的右边约束位置④ | ||||||||||||||||||||
android:groupIndicator | 显示在组列表旁边的Drawable对象⑤ | ||||||||||||||||||||
android:indicatorLeft | 组列表项指示器的左边约束位置⑥ | ||||||||||||||||||||
android:indicatorRight | 组列表项指示器的右边约束位置 ⑦ |
备注:
① 注:图片不会完全显示,分离子列表项的是一条直线
② 注:可以是一个图片
③ 注:即从左端0位置开始计数,比如,假设指示符是一个图标,给定这个属性值为3dip,则表示从左端起3dip开始显示此图标。
④ 注:表示右端到什么位置结束
⑤ 注:可以是一个图片。
⑥ 注:表示左端从什么位置开始。
⑦ 注:表示右端到什么位置结束。
二:
一般适用于ExpandableListView的Adapter都要继承BaseExpandableListAdapter这个类,并且必须重载getGroupView和getChildView这两个最为重要的方法。
当扩展BaseExpandableListAdapter时,关键是实现如下四个方法:
public abstract ViewgetChildView (int groupPosition, intchildPosition, boolean isLastChild, ViewconvertView, ViewGroup parent)
取得显示给定分组给定子位置的数据用的视图.
参数
groupPosition 包含要取得子视图的分组位置.
childPosition 分组中子视图(要返回的视图)的位置.
isLastChild 该视图是否为组中的最后一个视图.
convertView 如果可能,重用旧的视图对象.使用前你应该保证视图对象为非空,并且是否是合适的类型.如果该对象不能转换为可以正确显示数据的视图,该方法就创建新视图.不保证使用先前由getChildView(int, int,boolean, View, ViewGroup)创建的视图.
parent 该视图最终从属的父视图.
返回 指定位置相应的子视图.
public abstract intgetChildrenCount (int groupPosition)
取得指定分组的子元素数.
参数
groupPosition 要取得子元素个数的分组位置.
返回 指定分组的子元素个数.
public abstract ViewgetGroupView (int groupPosition, booleanisExpanded, View convertView, ViewGroupparent)
取得用于显示给定分组的视图.这个方法仅返回分组的视图对象,要想获取子元素的视图对象,就需要调用getChildView(int, int, boolean, View, ViewGroup).
参数
groupPosition 决定返回哪个视图的组位置.
isExpanded 该组是展开状态还是收起状态 .
convertView 如果可能,重用旧的视图对象.使用前你应该保证视图对象为非空,并且是否是合适的类型.如果该对象不能转换为可以正确显示数据的视图,该方法就创建新视图.不保证使用先前由getGroupView(int, boolean,View, ViewGroup)创建的视图.
parent 该视图最终从属的父视图.
返回 指定位置相应的组视图.
public abstract intgetGroupCount ()
取得分组数.
返回 分组数.
BaseExpandableListAdapter的重载的其它方法如下:
public abstract Object getChild(int groupPosition, int childPosition)
取得与指定分组、指定子项目关联的数据.
参数
groupPosition 包含子视图的分组的位置.
childPosition 指定的分组中的子视图的位置.
返回 与子视图关联的数据.
public abstract long getChildId(int groupPosition, intchildPosition)
取得给定分组中给定子视图的ID.该组ID必须在组中是唯一的.必须不同于其他所有ID(分组及子项目的ID).
参数
groupPosition 包含子视图的分组的位置.
childPosition 要取得ID的指定的分组中的子视图的位置.
返回 与子视图关联的ID.
public abstract longgetCombinedChildId (long groupId, long childId)
取得一览中可以唯一识别子条目的ID(包括分组ID和子条目ID).可扩展列表要求每个条目(分组条目和子条目)具有一个可以唯一识别列表中子条目和分组条目的ID.该方法根据给定子条目ID和分组条目ID返回唯一识别ID.另外,如果hasStableIds()为真,该函数返回的ID必须是固定不变的.
参数
groupId 包含子条目ID的分组条目ID.
childId 子条目的ID.
返回 可以在所有分组条目和子条目中唯一识别该子条目的ID(可能是固定不变的).
public abstract longgetCombinedGroupId (long groupId)
取得一览中可以唯一识别子条目的ID(包括分组ID和子条目ID).可扩展列表要求每个条目(分组条目和子条目)具有一个可以唯一识别列表中子条目和分组条目的ID.该方法根据给定子条目ID和分组条目ID返回唯一识别ID.另外,如果hasStableIds()为真,该函数返回的ID必须是固定不变的.
参数
groupId 分组条目ID.
返回 可以在所有分组条目和子条目中唯一识别该分组条目的ID(可能是固定不变的).
public abstract Object getGroup(int groupPosition)
取得与给定分组关联的数据.
参数
groupPosition 分组的位置.
返回 指定分组的数据.
public abstract long getGroupId(int groupPosition)
取得指定分组的ID.该组ID必须在组中是唯一的.必须不同于其他所有ID(分组及子项目的ID).
参数
groupPosition 要取得ID的分组位置.
返回
与分组关联的ID.
public abstract booleanhasStableIds ()
是否指定分组视图及其子视图的ID对应的后台数据改变也会保持该ID.
返回 是否相同的ID总是指向同一个对象.
public abstract booleanisChildSelectable (int groupPosition, intchildPosition)
指定位置的子视图是否可选择.
参数
groupPosition 包含要取得子视图的分组位置.
childPosition 分组中子视图的位置.
返回 是否子视图可选择.
三:
private ExpandableListView listView;
ExpandableListView 设置默认展开,以及去掉箭头标志
<div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.875; font-size: 14px;"><pre name="code" class="html">public void setExpandableListView() {
//去掉前面的箭头图标
listView.setGroupIndicator(null);
//将所有项设置成默认展开
int groupCount = listView.getCount();
for (int i = 0; i < groupCount; i++) {
listView.expandGroup(i);
}
}
如果想让它一直展开,点击groupV
iew也不会收缩的话,listView.setOnGroupClickListener中的onGroupClick();返回值应为true
ExpandableListView 的监听:
如果使用ExpandableListView,需要子item响应一个事件,比如重新启动一个新的activity,需要满足下面的条件:
(1).修改Adapter返回值
覆写BaseExpandableListAdapter的isChildSelectable()的返回值为true;
(2).绑定监听器
调用ExpandableListView对象的setOnChildClickListener()、setOnGroupClickListener方法,为其绑定监听器
<pre name="code" class="html">listView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
//TODO
return false;
}
});
listView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
//TODO
return false;
}
});
ExpandableListView 的适配:
<pre name="code" class="html">public class HoldItemAdapter extends BaseExpandableListAdapter {
@Override
public int getGroupCount() {
return 0;
}
@Override
public int getChildrenCount(int groupPosition) {
return 0;
}
@Override
public Object getGroup(int groupPosition) {
return null;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return null;
}
@Override
public long getGroupId(int groupPosition) {
return 0;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return 0;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupViewHolder groupViewHolder;
if (convertView == null) {
groupViewHolder = new GroupViewHolder();
convertView = layoutInflater.inflate(R.layout.list_hold_category, null);
groupViewHolder.name = (TextView) convertView.findViewById(R.id.name);
groupViewHolder.cbIsAllHold = (CheckBox) convertView.findViewById(R.id.cbIsAllHold);
convertView.setTag(groupViewHolder);
} else {
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
//TODO ...
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildViewHolder holder;
if (convertView == null) {
holder = new ChildViewHolder();
convertView = layoutInflater.inflate(R.layout.list_hold_item, null);
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.cbIsHold = (CheckBox) convertView.findViewById(R.id.cbIsHold);
convertView.setTag(holder);
} else {
holder = (ChildViewHolder) convertView.getTag();
}
//TODO ...
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
/* class ViewHolder */
private class GroupViewHolder {
TextView name;
CheckBox cbIsAllHold;
}
private class ChildViewHolder {
TextView name;
CheckBox cbIsHold;
}
}