Android

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

页面
字体
小树 · 1月11日 · 2016年

在实际开发中,经常会需要需要在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它们就好了

转载必须注明来源: 小树技术博客 » ScrollView嵌套ViewPager嵌套ListView三者共存&冲突解决方案

1 条回应
  1. 赵林IT2016-3-20 · 22:55

    第一感觉博主的博客很特别,音乐几个音调挺动听,没注意到哪里可以关闭当前菜单音乐,其次博主技术学习的挺多了,工作从前端到后台到Android