按照android的標準,ScrollView中是不能嵌套具備滑動特性的View的,可是有時若是設計真的有這樣作的須要,或者爲了更方便簡單的實現外觀(好比在外在的大布局須要有滑動的特性,而且內部有相似於List的UI結構,那麼ListView + Adpater的方式來實現裏面的效果就很方便,算是違規抄近道的一種方式吧),有時就會不得不採用這種怪異的組合方式。java
先說下這種方式若是不作特殊處理時會出現的衝突和問題:android
1,在SrollView中嵌套ListView,ListView的顯示會有問題,只顯示一行或顯示效果與預期不一樣,這是由於android禁止這樣使用,放入ScrollView中的ListView的高度是沒法計 算的。函數
2,嵌套中的子ListView和GridvIew是沒法滑動的,由於子控件的滑動事件會被外面的ScrollView吃掉,若是想讓子控件能夠滑動,只能強行的截取滑動的相關事件了。佈局
言歸正傳,嵌套的解決方案:ui
1,第一種方案,也是我比較推薦的方案,就是重寫ListView與GridView,讓其失去滑動特性:spa
package com.perfect.xiaoao.all.ui; import android.content.Context; import android.util.AttributeSet; import android.widget.GridView; /** * Created by IntelliJ IDEA. * User: zhUser * Date: 13-1-24 * Time: 下午6:53 */ public class NoScrollGridView extends GridView{ public NoScrollGridView(Context context, AttributeSet attrs){ super(context, attrs); } public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ int mExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, mExpandSpec); } } package com.perfect.xiaoao.all.ui; import android.content.Context; import android.util.AttributeSet; import android.widget.ListView; /** * Created by IntelliJ IDEA. * User: zhUser * Date: 13-1-24 * Time: 下午6:53 */ public class NoScrollListView extends ListView{ public NoScrollListView(Context context, AttributeSet attrs){ super(context, attrs); } public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ int mExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, mExpandSpec); } }
上面的makeMeasureSpec方法:
.net
一個MeasureSpec封裝了父佈局傳遞給子佈局的佈局要求,每一個MeasureSpec表明了一組寬度和高度的要求。一個MeasureSpec由大小和模式組成。它有三種模式:UNSPECIFIED(未指定),父元素部隊自元素施加任何束縛,子元素能夠獲得任意想要的大小;EXACTLY(徹底),父元素決定自元素的確切大小,子元素將被限定在給定的邊界裏而忽略它自己大小;AT_MOST(至多),子元素至多達到指定大小的值。設計
它經常使用的三個函數:code
1.static int getMode(int measureSpec):根據提供的測量值(格式)提取模式(上述三個模式之一)orm
2.static int getSize(int measureSpec):根據提供的測量值(格式)提取大小值(這個大小也就是咱們一般所說的大小)
3.static int makeMeasureSpec(int size,int mode):根據提供的大小值和模式建立一個測量值(格式)
這個類的使用呢,一般在view組件的onMeasure方法裏面調用.
看看它的使用吧,ListView.measureItem(View child)
首先一個咱們經常使用到的一個有用的函數,View.resolveSize(int size,int measureSpec)
9023 public static int makeMeasureSpec(int size, int mode) { 9024 return size + mode; 9025 }
具體看Android源碼吧。