Viewpager嵌套ScrollView和ListView嵌套ScrollView引起的冲突问题
来源:互联网 发布:单片机数码管显示0到9 编辑:程序博客网 时间:2024/06/05 17:52
之前很少用到Viewpager或者ListView外嵌套ScrollView的方式作为布局,觉得这样太傻逼和太难理解,但真正接触到这样的需求的时候,才发现傻逼的是自己啊,坑!世上真有这么奇葩的事情发生。尤其深深记得两个月前去面试的时候,有个面试官就问到了这个问题,很明显是他最近开发中遇到的问题,可特么那时候我真的不会啊,但是猜的出肯定会有滑动冲突啦,但是鬼才会在当时那种情况下想得出来。于是自己用到之后,经过深深的网上搜索,StackOverFlow大神的答案,08年的问题啊,吓哭了,哥们我15年才遇到这个问题,真是差距。废话不说,直接上:
1.Viewpager嵌套ScrollView遇到的问题:
状况:滑动ListView时,没有任何作用。
原因:外层的ScrollView的onInterceptTouchEvent()拦截事件拦截了ListView的滑动事件的处理。
解决办法:无非对症下药呗。重写onInterceptTouchEvent()方法,只需要在滚动是让ScrollView不处理事件而让子View去处理。
代码如下:
public class VerticalScrollView extends ScrollView { private GestureDetector mGestureDetector; public VerticalScrollView(Context context, AttributeSet attrs){ super(context, attrs); mGestureDetector = new GestureDetector(context, new YScrollDetector()); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev); } class YScrollDetector extends SimpleOnGestureListener { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { /** * if we're scrolling more closer to x direction, return false, let subview to process it */ return (Math.abs(distanceY) > Math.abs(distanceX)); } }}
2.ListView嵌套ScrollView遇到的问题:
状况:只能显示一行ListView数据
原因:外层嵌套ScrollView后,导致ListView没法确定计算本身的高度了,只能显示一行数据了。
解决办法:在listView设置完adapter后,根据listView的子项目重新计算ListView的高度,然后将高度作为LayoutParams设置给ListView(相当于代码动态的去计算ListView的高度)
代码如下:public void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目 View listItem = listAdapter.getView(i, null, listView); // 计算子项View 的宽高 listItem.measure(0, 0); // 统计所有子项的总高度 totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1)); // listView.getDividerHeight()获取子项间分隔符占用的高度 // params.height最后得到整个ListView完整显示需要的高度 listView.setLayoutParams(params); }
注:即使这样能解决具体问题,但是再有上拉刷新和下拉加载的ListView中可能会有意外状况,这点就不叙说了。最重要的是在listView的布局中,还要多嵌套<LinearLayout>
1 0
- Viewpager嵌套ScrollView和ListView嵌套ScrollView引起的冲突问题
- scrollview和viewpager嵌套冲突的问题
- ScrollView嵌套ViewPager滑动冲突的问题
- 解决ScrollView嵌套viewpager的冲突问题
- Listview和scrollview嵌套冲突问题
- listview嵌套listview ScrollView嵌套listview 的冲突问题
- listview ,scrollview,viewpager,嵌套问题
- ScrollView嵌套ListView冲突问题
- Scrollview嵌套ListView冲突问题
- ScrollView里嵌套ListView的冲突问题
- 解决scrollView嵌套listview的冲突问题
- ScrollView嵌套ListView冲突问题的解决方案
- ScrollView嵌套ListView冲突问题的解决方案
- Scrollview嵌套listVIew冲突问题的解决
- 解决ScrollView或ListView中嵌套ListView引起的冲突
- ScrollView嵌套ViewPager引起的滑动冲突的解决方案
- ScrollView嵌套ViewPager冲突
- ScrollView中嵌套ListView和GridView冲突问题的解决
- 九度oj 1194
- CFI与SPI flash区别
- NSString中stringWithFormat的用法
- uva 524(素数环)
- 最近半年工作总结
- Viewpager嵌套ScrollView和ListView嵌套ScrollView引起的冲突问题
- TCP学习记录
- SPI理解
- 数据结构---单链表(2)
- 多态与继承中的开闭原则和里氏替换原则简述
- C#编程:字符串转16进制数据以及16进制数据转字符串
- 2008 数值统计
- 面试题 ——— 二维数组的查找
- POJ 1002 487-3279(快排)