您的位置:首页 > 其它

ExpandableListView

2016-01-27 13:38 176 查看

基础

它本质上仍旧是ListView,只不过将item分成group和child两种(BaseAdapter.getViewTypeCount()返回的是2).之所以会出现展开效果,是因为它调用了adapter中的notifyDataSetChanged(),刷新了ListView整个条目的个数,所以整个界面便显现出展开效果了。

由于它本质上是ListView,所以它的OnScrollListener#onScroll(AbsListView, int, int, int)中的第二个参数仍旧是从0开始递增。递增的过程中并不会区分这个item是group还是child类型的。

由于无论是展开还是折叠,都会调用notifyDataSetChanged(),也就会重新调用一次adapter中的getView()方法,因此可以根据BaseExpandableListAdapter.getGroupView()中的第二个参数isExpanded判断当前该group是展开还是折叠,同时更改group的样式。这也是ExpandableListView在展开和折叠之间切换图标的方法。简单示例如下:

public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
if (isExpanded) {
System.out.println("展开");
} else {
System.out.println("折叠");
}
return null;
}

常用方法

getExpandableListPosition():获取该item在listview中的原始position(the raw position of an item (child or group) in the list)。由于ExpandableListView实质上仍旧是一个ListView,所以每一个item(无论是Group还是Child)在ListView中肯定有一个position,该方法返回的便是这个position。但要注意:这个position并不像我们平时写listview的adapter那样从0开始的,而是有一套自己的计算方式。当使用ExpandableListView.getPackedPositionType
(),ExpandableListView.getPackedPositionChild或者ExpandableListView.getPackedPositionGroup 时,直接使用该方法的返回值当这些方法的参数。
getPackedPositionGroup():返回经过包装后的group的position,即当前的group在所有group中的第几个(从0开始)。参数是getExpandableListPosition()的返回值。
getPackedPositionChild():返回经过包装后的child的position,即在该group中该child的下标(从0开始)。如果该group中没有child或者显示的是group界面,那么返回的是-1。参数是getExpandableListPosition()的返回值。
getPackedPositionType():获取指定位置处的item的type,即是Group还是child。参数是getExpandableListPosition()的返回值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: