想要ListView自動計算高度其實也很簡單,我們只要繼承ListView控件,重寫onMeasure方法即可,代碼如下。
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;
/**
* 自定義Listview,可以自己測量每個自item的高度 適用於在ScrollView中嵌套
*
* @author liubing
*
*/
public class MyListView extends ListView {
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyListView(Context context) {
super(context);
}
public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//根據模式計算每個child的高度和寬度
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
這裏我們來解釋一下MeasureSpec這個類
一個MeasureSpec封裝了父佈局傳遞給子佈局的佈局要求,每個MeasureSpec代表了一組寬度和高度的要求。一個MeasureSpec由大小和模式組成。它有三種模式:UNSPECIFIED(未指定),父元素部隊自元素施加任何束縛,子元素可以得到任意想要的大小;EXACTLY(完全),父元素決定自元素的確切大小,子元素將被限定在給定的邊界裏而忽略它本身大小;AT_MOST(至多),子元素至多達到指定大小的值。
它常用的三個函數:
1.static int getMode(int measureSpec):根據提供的測量值(格式)提取模式(上述三個模式之一)
2.static int getSize(int measureSpec):根據提供的測量值(格式)提取大小值(這個大小也就是我們通常所說的大小)
3.static int makeMeasureSpec(int size,int mode):根據提供的大小值和模式創建一個測量值(格式)
makeMeasureSpec(int size, int mode) 這個方法的主要作用就是根據你提供的大小和模式,返回你想要的大小值.