DBMNG数据库管理与应用

书籍是全世界的营养品。生活里没有书籍,就好像没有阳光;智慧里没有书籍,就好像鸟儿没有翅膀。
当前位置:首页 > 移动应用 > Android

android中swiperefreshlayout嵌套scrollview产生事件冲突的解决方法

解决swiperefreshlayout与scrollview的冲突问题

1.情况方案一:

在开发中,我们会用到新的控件swipeRefreshLayout,但是我们同时又要用到scrollView。我们知道swipeRefreshLayout和scrollView这两个控件的子控件都必须有且只有一个的,而且这两个控件都会检测用户滑动的动作,由于事件的分派的问题,就出现了我们所遇到的冲突问题。
下面是我实践过,可行的解决两者共用所产生的滚动冲突问题。
原理很简单:就是在scrollview还没有到达第一条数据顶部的时候,就设置swipeRefreshLayout为不可操作状态,那么检测swipeRefreshLayout的滚动分发就不起作用了,就达到我们需要的目的了。
if (scrollView != null) {  
            scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {  
                @Override  
                public void onScrollChanged() {  
                    if (swipeRefreshLayout != null) {  
                        swipeRefreshLayout.setEnabled(scrollView.getScrollY() == 0);  
                        CommonLog.infoLog("init scrollView");  
                    }  
                }  
            });  
}  

2.情况方案二:

当swipeRefreshLayout ScrollView 嵌套使用时,你先将ScrollView 向上滑动一部分,然后松手.然后再向下滑动,此时应该是先触发滑动事件,当ScrollView到顶部以后才触发刷新时间.但是此时会出现先触发swipeRefreshLayout的问题。


mScrollView.getViewTreeObserver().addOnScrollChangedListener(new  ViewTreeObserver.OnScrollChangedListener() {
    @Override
    public void onScrollChanged() {
    	mSwipeRefreshLayout.setEnabled(mScrollView.getScrollY()==0);
    }
});



3.情况方案三:

SwipeRefreshLayout的子控件中嵌套了其他可滚动控件例如
 <android.support.v4.widget.SwipeRefreshLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
                <ScrollView
                    android:layout_width="match_parent"
                    android:layout_height="0dip"
                    android:layout_weight="1"
                    android:id="@id/svCar"
                    android:fadingEdge="none" >
                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"/>
                </ScrollView>
                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"/>
        </LinearLayout>        
</android.support.v4.widget.SwipeRefreshLayout>

那么,当ScrollView滚动到下方后,向下拉ScrollView不会滚动而会出现下拉刷新动作,这时需要将ScrollView设置onTouch事件    

OnTouchListener onTouchListener=new OnTouchListener() {        
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_UP:
                if (svCar.getScrollY() > 0) {
                    srlCar.setEnabled(false);
                } else {
                    srlCar.setEnabled(true);
                }
                break;
            }
            return false;
        }
};
本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号