之前有整理過ScrollView嵌套ListView的例子,講的是計算listview的每一項的高度。已達到目標效果。同樣的ExpandableListView嵌套ScrollView也是這么個思路,不過要稍微加一些方法和稍微做一些改動。
要實現這個功能首先要准備三個基礎的方法:
一、計算ExpandableListView的group項的高度的方法(即計算listview合並時的高度的方法)備注:ExpandableListView是listview的子類所以,listview的方法它同樣可以使用
/** 動態改變listView的高度 */ public void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); // params.height = 80 * (listAdapter.getCount() - 1); // params.height = 80 * (listAdapter.getCount()); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); ((MarginLayoutParams) params).setMargins(0, 0, 0, 0); listView.setLayoutParams(params); }
二、計算ExpandableListView展開時group下的子view列表的高度的方法
/** * 可擴展listview展開時調用 * * @param listView * @param groupPosition */ public static void setExpandedListViewHeightBasedOnChildren( ExpandableListView listView, int groupPosition) { ExpandableListAdapter listAdapter = listView.getExpandableListAdapter(); if (listAdapter == null) { return; } View listItem = listAdapter.getChildView(groupPosition, 0, true, null, listView); listItem.measure(0, 0); int appendHeight = 0; for (int i = 0; i < listAdapter.getChildrenCount(groupPosition); i++) { appendHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); // Log.d(TAG, "Expand params.height" + params.height); params.height += appendHeight; listView.setLayoutParams(params); }
三、計算ExpandableListView合並時消除group下的子view列表的高度的方法
/** * 可擴展listview收起時調用 * * @param listView * @param groupPosition */ public static void setCollapseListViewHeightBasedOnChildren( ExpandableListView listView, int groupPosition) { ExpandableListAdapter listAdapter = listView.getExpandableListAdapter(); if (listAdapter == null) { return; } View listItem = listAdapter.getChildView(groupPosition, 0, true, null, listView); listItem.measure(0, 0); int appendHeight = 0; for (int i = 0; i < listAdapter.getChildrenCount(groupPosition); i++) { appendHeight += listItem.getMeasuredHeight(); } /*Log.d(TAG, "Collapse childCount=" + listAdapter.getChildrenCount(groupPosition));*/ ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height -= appendHeight; listView.setLayoutParams(params); }
三個計算方法都貼出來了,下面來看看這三個方法到底是怎樣使用的
一、在設置ExpandableListView的adapter的時候計算一下它合並時的寬度,並顯示出來。(這一步是初始化)
例如:
listView.setAdapter(adapter);
ListUtil.getInstance().setListViewHeightBasedOnChildren(listView);
二、當ExpandableListView展開時調用計算方法
例如:
/** * 當ExpandableListView展開時調用 */ listView.setOnGroupExpandListener(new OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { /* * Log.e("expand", "擴展"); for (int i = 0; i < 4; i++) { if * ((groupPosition != i) && listView.isGroupExpanded(i)) { * listView.collapseGroup(i); } } */ /** * 計算group下的子項的高度 */ ListUtil.setExpandedListViewHeightBasedOnChildren(listView, groupPosition); // 更新group每一項的高度 ListUtil.getInstance().setListViewHeightBasedOnChildren( listView); } });
三、當ExpandableListView合並時調用計算方法
例如:
/** * 當ExpandableListview收縮時調用 */ listView.setOnGroupCollapseListener(new OnGroupCollapseListener() { @Override public void onGroupCollapse(int groupPosition) { Log.e("collapse", "收縮"); /* * 計算group下的每一個子項的高度,然后收縮 */ ListUtil.setCollapseListViewHeightBasedOnChildren(listView, groupPosition); /* * 重新評估group的高度 */ ListUtil.getInstance().setListViewHeightBasedOnChildren( listView); /* * ListUtil.setCollapseListViewHeightBasedOnChildren(listView, * groupPosition); */ } });
好了,到這里就結束了。備注:在計算方發中的adapter中的layout外層布局不能是RelativeLayout,否則將會報空指針。具體什么原因我就不說了,晚上一大堆的。