1. 程式人生 > >GridView巢狀在ViewPager中,ViewPager巢狀在ScrollView中不顯示

GridView巢狀在ViewPager中,ViewPager巢狀在ScrollView中不顯示

1.問題描述

ViewPager中的page是GridView,ViewPager巢狀在ScrollView中,ViewPager設定高度為MATCH_PARENT或者WRAP_CONTENT都不顯示。

2.解決方法

2.1 方法1

網上提出的解決方法是設定ViewPager的高度為固定值。

確實這樣可以顯示,但是這個固定值不好控制,不像一些廣告banner可以設定固定的值,這裡的item是GridView,而且GridView高度不會超過一螢幕。

2.2 方法2

設定ScrollView的android:fillViewport=”true”。

顯示效果如下:

fillViewport

ViewPager直接填充了父控制元件,當GridView高度不足以填充時,下方會有空白部分。

2.3 方法3 終極奧義

重寫ViewPager和GridView。

主要重寫兩個控制元件的onMeasure方法。程式碼如下:

public class WrapContentViewPager extends ViewPager {

    public WrapContentViewPager(Context context) {
        super(context);
    }

    public WrapContentViewPager(Context context, AttributeSet attrs) {
        super
(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int height = 0; //下面遍歷所有child的高度 for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0
, MeasureSpec.UNSPECIFIED)); int h = child.getMeasuredHeight(); if (h > height) //採用最大的view的高度。 height = h; } heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }
public class MultiGridView extends GridView {
    public MultiGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MultiGridView(Context context) {
        super(context);
    }

    public MultiGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }

}

注意:如果只重寫ViewPager,GridView只顯示一行。

oneline

而我要這樣的:

ok

3下載