ScrollView GridView ListView 都有上下滑動的響應函數,所以嵌套在一起的話,裡面那一層就監聽不到滑動的響應。
如果不處理的話,GridView 和 ListView 在ScrollView中只會顯示一部分高度,這樣看起來不是很鬱悶?
在特殊的情況下,我們需要嵌套起來使用才能符合介面的設計.
SO 在網上找了一些時間後,發現解決辦法還是有的,一下是我個人覺得簡單,易用,缺點不多的一種方法:
自訂一個類 繼承GridView或者ListView,重寫其中的 onMeasure 方法、、
onMeasure方法是在這個View構造的時候確定它的長度和寬度的方法。
我們重寫的時候,要把捲軸設定為沒有捲軸,Gridview就會按照有多少行,就顯示多少行
廢話少說,上代碼
[html]
view plaincopyprint?
- public class MyGridView extends GridView {
- private boolean haveScrollbar =
true;
- public MyGridView(Context context) {
- super(context);
- }
- public MyGridView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- public MyGridView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
- /**
- * 設定是否有ScrollBar,當要在ScollView中顯示時,應當設定為false。 預設為 true
- *
- * @param haveScrollbars
- */
- public void setHaveScrollbar(boolean haveScrollbar) {
- this.haveScrollbar =
haveScrollbar;
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- if (haveScrollbars == false) {
- int expandSpec =
MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
- super.onMeasure(widthMeasureSpec, expandSpec);
- } else {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- }
- }
- }
public class MyGridView extends GridView {</p><p>private boolean haveScrollbar = true;</p><p>public MyGridView(Context context) {<br />super(context);<br />}</p><p>public MyGridView(Context context, AttributeSet attrs) {<br />super(context, attrs);<br />}</p><p>public MyGridView(Context context, AttributeSet attrs, int defStyle) {<br />super(context, attrs, defStyle);<br />}</p><p>/**<br /> * 設定是否有ScrollBar,當要在ScollView中顯示時,應當設定為false。 預設為 true<br /> *<br /> * @param haveScrollbars<br /> */<br />public void setHaveScrollbar(boolean haveScrollbar) {<br />this.haveScrollbar = haveScrollbar;<br />}</p><p>@Override<br />protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {<br />if (haveScrollbars == false) {<br />int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);<br />super.onMeasure(widthMeasureSpec, expandSpec);<br />} else {<br />super.onMeasure(widthMeasureSpec, heightMeasureSpec);<br />}<br />}<br />}<br />
在xml中這麼定義:
[html]
view plaincopyprint?
- <com.erp.android.control.NDGridView
- android:id="@+id/myGrideView"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:columnWidth="100dp"
- android:gravity="center"
- android:numColumns="auto_fit"
>
- </com.erp.android.control.MyGridView>
<com.erp.android.control.NDGridView<br /> android:id="@+id/myGrideView"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:layout_gravity="center"<br /> android:columnWidth="100dp"<br /> android:gravity="center"<br /> android:numColumns="auto_fit" ><br /> </com.erp.android.control.MyGridView>
重寫就重寫了這一個地方,我認為的缺點就是設定之後不能上下滑動了,不過有ScrollView 可以代替這一功能