如果Listview的Item高度是动态的,例如包含Textview并且超过一行的情况下,如果继续用以上两种方法,那么计算的只是一行TextView的高度
所以这里给了一个很简单的方法,如下:
// 动态改变listView的高度 ,解决TextView超过一行,高度只计算一行的问题
public int setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return 0;
}
int totalHeight = 0;
int listViewWidth = ConstValue.screenWidth (屏幕宽度)- Tool.convertDpToPx(this, 12)(dp转PX);//listView在布局时的宽度 ,screenWidth - 左右的padding - 左右的margin
int widthSpec = View.MeasureSpec.makeMeasureSpec(listViewWidth, View.MeasureSpec.AT_MOST);
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
// 计算子项View 的宽高
listItem.measure(widthSpec, 0);
// 统计所有子项的总高度
int itemHeight = listItem.getMeasuredHeight();
totalHeight += itemHeight;
System.out.println("listView.totalHeight: " + totalHeight + " itemHeight: " + itemHeight);
}
int historyHeight = totalHeight + (listView.getDividerHeight() * listAdapter.getCount() - 1);
// listView.getDividerHeight()获取子项间分隔符占用的高度
System.out.println("listViewHeight = " + historyHeight);
return historyHeight;
}