Tips_Android中ScrollView嵌套Listview或Gridview(ZZ)

按照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源碼吧。


ScrollView中嵌套GridView,Listview的辦法

MeasureSpec介紹及使用詳解

相關文章
相關標籤/搜索