布局中,如果設計ListView的高度為包裹內容,那么ListView的高度是隨着它的子條目的數量的變化而改變的,
這就可能會導致ListView下面的一些控件的位置也會隨着ListView的高度的變化而變化。
項目中可能會碰到需要動態調整或控制ListView的高度的情況,下面就分享一下我自己使用的一種辦法。
我遇到的問題:
ListView下面有一個Button,如果ListView子條目的數量較少,Button可以正常顯示在屏幕上,但如果ListView子條目的數量較多時,Button就會被擠出屏幕
因為考慮效果(Button要緊跟着ListView),所以不能把ListView的高度寫死,所以要使用包裹內容,
那么問題就是要解決Button的顯示,保證Button不被擠出屏幕
設計思路:
ListView子條目數量少時,下面緊跟着Button,
ListView子條目多時,Button顯示在屏幕底部,ListView的高度固定到Button上方
解決思路:
1、先計算出固定不變的控件的高度(屏幕中有些控件的大小是不需要改變的),基本就是除了ListView以外的控件(還要考慮是否需要計算狀態欄的高度)
2、獲取屏幕的高度
3、用屏幕高度 減掉 固定不變的高度 得到ListView的最大允許高度
4、計算ListView每個子條目的高度並累加,得到ListView的真實高度
5、判斷真實高度和最大允許高度的差值,如果真實高度超出了最大允許高度,就把ListView的高度設定為最大允許高度,否則就不需要處理
代碼:
/**
* 測量控件高度的方法:
* @param view 需要測量的控件
* @return 測量到的高度
*/
public int mesHeight(View view) {
int width = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
int height = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
view.measure(width, height);
return view.getMeasuredHeight();
}
step1:
// 固定不變的高度自己想辦法計算吧,情況不同,計算方法也不同
// 提供一些信息:有固定值的直接累加,另外如果有margintop和marginbottom屬性的也要加上,沒有有固定值的使用上面的方法計算
// 如果需要計算狀態欄高度的,也可以在網上搜索一下,應該有很多
step2:
// 獲取屏幕高度
int screenHeight = getWindowManager().getDefaultDisplay().getHeight();
step3:
screenHeight 減掉 你計算的固定高度
step4:
// ListView子條目的高度也需要自己計算,情況不同方法不同,但思路和上面的固定高度的算法思路一樣
step5:
// 當前listview的總高度
int currentHeight = 0; :
for (int i = 0; i < lv.size(); i++) {
currentHeight += item;
}
if (currentHeight > maxHeight) {
LayoutParams param = new LayoutParams(LayoutParams.FILL_PARENT,
maxHeight);
lv.setLayoutParams(param);
lv.setPadding(0,0, 0,0);//看個人情況
lv_classes.setDivider(null);//看個人情況
}
方法中代碼不完整,主要是因為每個項目中的布局都是不一樣的,所以無法給出一個准確的計算方法,但提供的思路希望能起到幫助。
