1. 程式人生 > >解決ListView與SwipeRefreshLayout滑動衝突的問題

解決ListView與SwipeRefreshLayout滑動衝突的問題

這個問題呢,在我初次接觸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,到了頂端以後再啟用,就不會產生衝突了