ScrollView嵌套ViewPager嵌套ListView三者共存&冲突解决方案

qsuron 发布于 2016-01-11 Android开发 350 次阅读 1 评论 328 字 预计阅读时间: 1 分钟


 

在实际开发中,经常会需要需要在ScrollView下,嵌套一个ViewPager,整体可以上下滑动。ViewPager中是一些Fragment,可以进行左右滑动切换。Fragment中嵌套ListView,实现数据的列表显示,同理也是随着整个ScrollView上下滑动。效果图如下:

QQ图片20160111095955  QQ图片20160111100401

 

 

首先要解决的就是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它们就好了

代码敲的累了,换个中文悠闲悠闲。
最后更新于 2025-05-24