ExpandableListView

基础

        它本质上仍旧是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()的返回值。

你可能感兴趣的:(ExpandableListView)