欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-17 18:51:48
...

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

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

        <ListView
            android:id="@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </android.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,到了顶端以后再启用,就不会产生冲突了