GridView巢狀在ViewPager中,ViewPager巢狀在ScrollView中不顯示
阿新 • • 發佈:2019-01-24
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”。
顯示效果如下:
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只顯示一行。
而我要這樣的: