自定義控件解決ListView和ScrollView衝突

  想要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)  這個方法的主要作用就是根據你提供的大小和模式,返回你想要的大小值.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章