解决ViewPager与GridView嵌套的滑动不流畅和高度无法自适应
2017-01-04 16:04
447 查看
最近产品提了一个需求,要求把首页的导航按钮改成和美团类似的可翻页的GridView。
![](https://img-blog.csdn.net/20170104160545455?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVzaGljaGFvMDg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
乍一看,这不就是ViewPager嵌套两个GridView吗,简单简单。简单的答应后,我就掉进了控件嵌套的大坑中。
简单的写好代码后,满心欢喜的运行程序,咦???我的ViewPager去哪了?GridView呢?(黑人问号)在一番努力之后,我终于找到了问题的原因,当Viewpager和GridView嵌套时,如果ViewPager的高度设置成warp_content,会导致控件不显示。解决这个问题有两个方案。
一、既然warp_content不行,那么给ViewPager直接设置一个高度!搞定,简单省事,不过这样有一个缺点,就是没法保证所有机型适配,而且有时候GridView内容多,有两行并分页,有时候内容少,只有一行,那么就会空出一部分的高度,导致界面不美观。
二、上面的方法有点太简单粗暴了,这里就介绍一下我现在用的方法,自定义一个ViewPager,在onMeasure中计算他的子View的高度,取最高的来作为自己的高度。代码如下
当然,用了方法二之后,如果你用的是普通的GridView和我们自定义的ViewPager嵌套的话,会发现一个事情,那就是我们的GridView的第二行不见了!只剩下了一行,又是嵌套的鬼问题,GridView显示不全了,这里我们的GridView也需要自定义一下,这个就比较普遍了,大家一般都是用的这个,重写一下GridView的onMeasure。
好了!大功告成!我们的ViewPager可以和GridView嵌套并且能自适应高度啦!开心的赶紧上去滑一滑,可是一碰,感觉有点不对劲。滑动的时候总感觉没那么灵敏,很难滑到第二页,这也是因为控件嵌套导致手势冲突。没关系,我们接着回到我们自定义的ViewPager中,重写他的dispachTouchEvent方法
记录一下手指按下时的X,Y坐标,然后在移动通过计算,如果左右移动的话就阻止父控件拦截事件,这样就能在左右滑动的时候灵活滑动了。
好了,这个问题解决以后,我们的控件应该就比较完整了,其他都是GridView和ViewPager的老套路。终于跳出了GridView和ViewPager嵌套的大坑,希望能够帮助到有同样需求的同学。
乍一看,这不就是ViewPager嵌套两个GridView吗,简单简单。简单的答应后,我就掉进了控件嵌套的大坑中。
简单的写好代码后,满心欢喜的运行程序,咦???我的ViewPager去哪了?GridView呢?(黑人问号)在一番努力之后,我终于找到了问题的原因,当Viewpager和GridView嵌套时,如果ViewPager的高度设置成warp_content,会导致控件不显示。解决这个问题有两个方案。
一、既然warp_content不行,那么给ViewPager直接设置一个高度!搞定,简单省事,不过这样有一个缺点,就是没法保证所有机型适配,而且有时候GridView内容多,有两行并分页,有时候内容少,只有一行,那么就会空出一部分的高度,导致界面不美观。
二、上面的方法有点太简单粗暴了,这里就介绍一下我现在用的方法,自定义一个ViewPager,在onMeasure中计算他的子View的高度,取最高的来作为自己的高度。代码如下
/** * 根据测量的子view设置pager高度 * @param widthMeasureSpec * @param heightMeasureSpec */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 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); super.onMeasure(widthMeasureSpec, heightMeasureSpec); }
当然,用了方法二之后,如果你用的是普通的GridView和我们自定义的ViewPager嵌套的话,会发现一个事情,那就是我们的GridView的第二行不见了!只剩下了一行,又是嵌套的鬼问题,GridView显示不全了,这里我们的GridView也需要自定义一下,这个就比较普遍了,大家一般都是用的这个,重写一下GridView的onMeasure。
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }
好了!大功告成!我们的ViewPager可以和GridView嵌套并且能自适应高度啦!开心的赶紧上去滑一滑,可是一碰,感觉有点不对劲。滑动的时候总感觉没那么灵敏,很难滑到第二页,这也是因为控件嵌套导致手势冲突。没关系,我们接着回到我们自定义的ViewPager中,重写他的dispachTouchEvent方法
private float mPointX; private float mPointY; /** * 解决嵌套后滑动不灵敏问题 * @param ev * @return */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: mPointX = ev.getX(); mPointY = ev.getY(); getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_MOVE: if (Math.abs(ev.getX() - mPointX) > Math.abs(ev.getY() - mPointY)) { getParent().requestDisallowInterceptTouchEvent(true); } else { getParent().requestDisallowInterceptTouchEvent(false); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: getParent().requestDisallowInterceptTouchEvent(false); break; default: break; } return super.dispatchTouchEvent(ev); }
记录一下手指按下时的X,Y坐标,然后在移动通过计算,如果左右移动的话就阻止父控件拦截事件,这样就能在左右滑动的时候灵活滑动了。
好了,这个问题解决以后,我们的控件应该就比较完整了,其他都是GridView和ViewPager的老套路。终于跳出了GridView和ViewPager嵌套的大坑,希望能够帮助到有同样需求的同学。
相关文章推荐
- ViewPager相互嵌套,导致里层ViewPager无法滑动问题解决
- 解决viewpager嵌套viewpager,子viewpager无法滑动的问题
- android ScrollView嵌套viewpager,viewpager嵌套gridview,解决内嵌无法显示的问题
- Android嵌套滑动控件的冲突解决和ViewPager适配当前子控件高度不留空白的办法
- android listview嵌套viewpager,viewpager嵌套gridview,解决内嵌无法显示以及时间冲突的问题
- 完美解决ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题
- 完美解决ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题
- HorizontalScrollView中嵌套ViewPager时,ViewPager无法滑动的问题解决方法
- 解决ScrollView或者listview嵌套ViewPager 时候 Pager左右滑动不流畅
- ViewPager相互嵌套,里层ViewPager无法滑动的解决方法
- ViewPager中嵌套HorizontalScrollView导致无法滑动换页冲突解决
- Android ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题解决方案
- Android嵌套滑动控件的冲突解决和ViewPager适配当前子控件高度不留空白的办法
- 解决ScrollView嵌套ViewPager,导致ViewPager不能滑动的问题
- 解决在scrollview上下滑动嵌套scrollview,viewpager水平滑动时的抖动问题
- ViewPager相互嵌套,里层ViewPager无法滑动
- ViewPager相互嵌套,里层ViewPager无法滑动
- 完美解决Android里面scrollview嵌套及listview嵌套viewpager的滑动冲突问题的简单方法
- Android之ViewPager中包含ViewFlipper时实现双滑动嵌套解决父控件干扰问题
- 被嵌套的ViewPager滑动失效解决