SwipeRefreshLayout 与ListView滑动冲突的解决

原创 2015年11月18日 10:13:20

SwipeRefreshLayout 与ListView滑动冲突问题

在SwipeRefreshLayout控件中,只能够放ListView或者LinearLayout单一控件,当SwipeRefreshLayout中放两个或多个并列布局时,就会出现滑动冲突问题:

  1. 如下布局,就会出现冲突问题,当向下滑动ListView时,SwipeRefreshLayout会优先获取事件。导致ListView不能够正常下拉。
<android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swip_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/white"
                android:gravity="center_vertical"
                android:orientation="vertical"
                android:paddingBottom="9dp"
                android:paddingTop="9dp" >



                <View
                    android:id="@+id/view1"
                    android:layout_width="fill_parent"
                    android:layout_height="50dip"
                    android:layout_marginLeft="15dp"
                    android:layout_marginRight="15dp"
                    android:layout_marginTop="10dp"
                    android:background="@color/home_fenge_line" />

                </LinearLayout>
            </LinearLayout>

            <ImageView
                android:id="@+id/iv_sawtooth"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/buy_list_details_sawtooth"
                android:contentDescription="@string/image_content" />

            <ListView
                android:id="@+id/lv_list"
                style="@style/pulltorefreshDividerListview"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >
            </ListView>
        </LinearLayout>
    </android.support.v4.widget.SwipeRefreshLayout>

怎么解决呢???
分析可以得到,有与SwipeRefreshLayout已经封装了方法,我们可以利用已有的方法来解决滑动冲突:
思路如下:判断ListView是否滑动到第一条数据,如果是,则SwipeRefreshLayout才获取事件(能够下拉刷新)。反之,让ListView 获取事件。那么我们可以实现让ListView OnScrollListener接口,在OnScroll和onScrollStateChanged两个方法中做出相应的判断:
ok,思路已经有了,代码如下:

@Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        this.lastItem = firstVisibleItem + visibleItemCount;
        this.totalItem = totalItemCount;
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (this.totalItem == lastItem && scrollState == SCROLL_STATE_IDLE) {
            Log.v("isLoading", "yes");
            if (!isLoading) {
                isLoading = true;
                footer.setVisibility(View.VISIBLE);
                onLoadMore.loadMore();//上拉加载
            }
        }
        //判断ListView是否滑动到第一个Item的顶部
        if (isValid!=null&&this.getChildCount() > 0 && this.getFirstVisiblePosition() == 0
                && this.getChildAt(0).getTop() >= this.getPaddingTop()) {
            //解决滑动冲突,当滑动到第一个item,下拉刷新才起作用
            isValid.setSwipeEnabledTrue();
        } else {
            isValid.setSwipeEnabledFalse();
        }
    }

ok,我们只需写个接口,给Swipe回调就行:

public interface OnSwipeIsValid{
        public void setSwipeEnabledTrue();
        public void setSwipeEnabledFalse();
    }

实现接口:

lvList.setSwipeIsVaildListenr(this);//ListView设置实现接口

    @Override
    public void setSwipeEnabledTrue() {
        swipe.setEnabled(true);//让swipe起作用,能够刷新
    }

    @Override
    public void setSwipeEnabledFalse() {
        swipe.setEnabled(false);//让swipe不能够刷新
    }

ok,分析完成。

版权声明:本文为博主原创文章,未经博主允许不得转载。

SwipeRefreshLayout下拉刷新跟listview下拉滑动冲突解决

当SwipeRefreshLayout内嵌listview的时候,滑动listview的时会启动swipeRefreshLayout的下拉刷新。我使用的解决办 法是设置listview的滑动监听,重...

关于SwipeRefreshLayout 与listView 滑动冲突的问题

最近项目里用到了 SwipeRefreshLayout  来处理诸如 listView ,ExpandableListView 的下拉刷新,上拉加载更多。         我的项目用到了 https...

Android:SwipeRefreshLayout和ViewPager滑动冲突的原因和正确的解决方式

一、前言急着解决问题的直接看博文的最后面吧,或者点这里跳转过去,正确的解决方式就在那。虽然SwipeRefreshLayout出来已经很久了,但是知道今天我才第一次使用。 然后发现两个问题: 1....

android-Ultra-Pull-To-Refresh/SwipeRefreshLayout嵌套ViewPager/ScrollView滑动冲突解决

android-Ultra-Pull-To-Refresh嵌套ViewPager滑动冲突解决 ,SwipeRefreshLayout嵌套ViewPager滑动冲突解决,每次必不可少的前戏又来了。发文时...

SwipeRefreshLayout与ViewPager滑动事件冲突源码分析及解决办法

问题描述: 开发中发现,SwipeRefreshLayout的下拉刷新与ViewPager的左右滑动存在冲突,导致ViewPager的左右滑动不灵敏。 原因分析: 通过查看ViewPager的源代...
  • iugg22
  • iugg22
  • 2016年07月28日 08:51
  • 274

解决SwipeRefreshLayout左右滑动事件冲突的问题

解决SwipeRefreshLayout左右滑动事件冲突的问题 转载自http://www.cnblogs.com/tianzhijiexian/p/4397537.html  ...

SwipeRefreshLayout和ViewPager滑动冲突的原理分析及解决方案

事先声明:本文只是对大神作品的整理,以及对事件分发的学习  相信SwipeRefreshLayout现在用的特别广泛了吧,但是SwipeRefreshLayout和viewpager貌似存在很多冲突...

解决使用`SwipeRefreshLayout`下拉刷新和左右滑动事件冲突的问题

解决使用SwipeRefreshLayout下拉刷新和左右滑动事件冲突的问题项目中某个功能从原生修改到加载h5,在h5中有左右滑动的广告图(下图中的A区域),该页还需要保留下拉刷新,使用的是Swipe...

复制AItsuki的Android:SwipeRefreshLayout和ViewPager滑动冲突的原因和正确的解决方式

原文链接:http://blog.csdn.net/u010386612/article/details/50548977 用第一种就解决了问题 BUG修复 2016.01.21 用...

自定义SwipeRefreshLayout 嵌套listview 并解决item点击事件焦点冲突问题

最近项目需要实现上拉加载更多,为了不引入第三方库,可以使用自定义SwipeRefreshLayout 来实现,作品摘自 简书:http://www.jianshu.com/p/d23b42b6360b...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SwipeRefreshLayout 与ListView滑动冲突的解决
举报原因:
原因补充:

(最多只允许输入30个字)