原因:在scrollView中ListView在OnMeasure階段無法測出實際的高度罚勾,我們需要給他設置AT_MOST模式以支持很大的高度毅人。這時候可以自定義一個MyListView 繼承自Listview,然后重寫onMeasure方法即可:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec
,MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST));
}
從上邊我們可以看出尖殃,我們沒有改變widthMeasureSpec丈莺,僅僅是調用了makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST)方法,該方法會返回一個帶有模式和大小信息的int值的送丰,第一個參數Integer.MAX_VALUE >> 2缔俄,我們知道我們的控件的大小的最大值是用30位表示的(int占32位,其中前兩位用來表示文章開頭所說的三種模式)器躏。那么Integer.MAX_VALUE來獲取int值的最大值俐载,然后右移2位,就得到這個最大值了 登失。因為是要最大值所以只能選擇AT_MOST模式遏佣。最后 super.onMeasure()方法將我們的高度值傳進去就可以使ListView內容都展示出來了。
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
int widthSpec = View.MeasureSpec.makeMeasureSpec(listView.getMeasuredWidth(), View.MeasureSpec.AT_MOST);
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(widthSpec, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}