• wpager嵌套ScrollView和ListView嵌套ScrollView引起的冲突问题


    iewpager嵌套ScrollView和ListView嵌套ScrollView引起的冲突问题

       之前很少用到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>

  • 相关阅读:
    poj3067 Japan(树状数组)
    Codeforces 482C Game with Strings(dp+概率)
    LeetCode -- 推断链表中是否有环
    螺旋矩阵——正逆序
    POJ 3905 Perfect Election(2-sat)
    设计模式 之 桥接
    Codeforces Round #257 (Div. 2)
    [LeetCode][Java] Minimum Window Substring
    Unity特殊目录和脚本编译顺序
    jQuery插件 -- Cookie插件
  • 原文地址:https://www.cnblogs.com/xiaoxiaoshen/p/5229819.html
Copyright © 2020-2023  润新知