太懒,直接上代码:
public static void setListViewHeightBasedOnChildren(ExpandableListView listView) { //获取ListView对应的Adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; for (int i = 0, len = listAdapter.getCount(); i < len; i++) { //listAdapter.getCount()返回数据项的数目 View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); //计算子项View 的宽高 totalHeight += listItem.getMeasuredHeight(); //统计所有子项的总高度 } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); //listView.getDividerHeight()获取子项间分隔符占用的高度 //params.height最后得到整个ListView完整显示需要的高度 listView.setLayoutParams(params); }
mAdapter = new ProjectNewAdapter(mContext, groupEntities, exlst); exlst.setAdapter(mAdapter); WindowManagerUtil.setListViewHeightBasedOnChildren(exlst);
exlst.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { // for (int i = 0, count = exlst // .getExpandableListAdapter().getGroupCount(); i < count; i++) { // if (groupPosition != i) {// 关闭其他分组 // exlst.collapseGroup(i); WindowManagerUtil.setListViewHeightBasedOnChildren(exlst); // } // } } }); exlst.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() { @Override public void onGroupCollapse(int groupPosition) { WindowManagerUtil.setListViewHeightBasedOnChildren(exlst); } });这样就可以保证,无论展开还是收缩,ExpandableListView都重新计算高度。