在实际开发中,经常会需要需要在ScrollView下,嵌套一个ViewPager,整体可以上下滑动。ViewPager中是一些Fragment,可以进行左右滑动切换。Fragment中嵌套ListView,实现数据的列表显示,同理也是随着整个ScrollView上下滑动。效果图如下:
首先要解决的就是scrollview下viewpager大小自适应的问题
最有效的方法肯定是 自定义一个viewpager并重写它的onMeasure方法
相关注释如下,如果有不对的请指正
`
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//如果 ViewPager 的上层是 ScrollView
//按照viewpager的高度,决定父元素scrollview的高度
if(viewInScrollView) {
int height = 0;
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)
height = h;
}
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
}
//如果 ViewPager 的下层有 ListView
//遍历所有子View,设置每个子View的大小,并找出高度最大的listview,设置为父元素viewpager的高度
if(viewWithListView) {
int maxHeight = 0;
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
if (child.getMeasuredHeight() > maxHeight) {
maxHeight = child.getMeasuredHeight();
}
}
if (maxHeight > 0) {
setMeasuredDimension(getMeasuredWidth(), maxHeight);
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
`
代码中用到了两个变量
private boolean viewInScrollView = false;
private boolean viewWithListView = false;
默认为false,根据需要去set它们就好了