解决ListView与SwipeRefreshLayout滑动冲突的问题

这个问题呢,在我初次接触SwipeRefreshLayout的时候也遇到过,后来查了相关资料和网络信息,得以解决,今天再次想到了这个问题,就记下来做个备忘吧。
首先说一下使用方式:SwipeRefreshLayout作为官方下拉刷新控件,要将 ListView控件包裹在里面,这样才能在滑动ListView的时候监听到滑动事件进而从顶部调出下拉刷新控件

.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/ly_refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        "@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    .support.v4.widget.SwipeRefreshLayout>

然而就是因为这样,才出现了滑动冲突问题,因为一旦启用SwipeRefreshLayout,只要是包裹之内的容器发生下拉动作,就会触发刷新,那样,ListView内容如果大于一屏,滚动到下面就无法回到顶部了,因为滚回顶部需要下拉滑动,就会首先触发SwipeRefreshLayout的下拉事件,尴不尴尬,扎不扎心?
没事,很好解决,直接看代码吧

lv.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int i) {

            }

            @Override
            public void onScroll(AbsListView absListView, int i, int i1, int i2) {
                boolean enable = false;
                if (lv != null && lv.getChildCount() > 0) {
                    boolean firstItemVisible = lv.getFirstVisiblePosition() == 0;
                    boolean topOfFirstItemVisible = lv.getChildAt(0).getTop() == 0;
                    enable = firstItemVisible && topOfFirstItemVisible;
                }
                lyRefresh.setEnabled(enable);
            }
        });

原理很简单,监听ListView的OnScrollListener事件,如果item没有滑到最顶端,就禁用SwipeRefreshLayout,到了顶端以后再启用,就不会产生冲突了

你可能感兴趣的:(解决ListView与SwipeRefreshLayout滑动冲突的问题)