android SwipeRefreshLayouth和ListView衝突解決
阿新 • • 發佈:2019-02-19
在最近的專案中,遇到下拉重新整理的需求..第一時間就想到了谷歌自家的SwipeRefreshLayouth,以前用過這個東西,在這裡面放一個listview或者gridview的時候效果很不錯.當初寫demo的時候也是這麼寫的.但是當真正使用他的時候,就發現了尷尬的事情.例如..我的SwipeRefreshLayouth裡面上方有兩個按鈕.按鈕下面才是listview,這個時候如果手指往上滑,去檢視更多的listview的item的時候沒有絲毫問題.但是當手指向下,準備檢視剛才滑過去的item的時候,竟然觸發了SwipeRefreshLayouth的下拉重新整理..表示很尷尬...這個時候我們僅僅需要在listview滑動的時候去判斷當前是不是第一個item就行了.是第一個的話再去啟用SwipeRefreshLayouth的重新整理功能,不然就禁用他的重新整理功能,所以我們直接給listview設定一個滑動監聽,然後在裡面設定SwipeRefreshLayouth的狀態就行了
package com.zzyzh.bbd.widget; import android.support.v4.widget.SwipeRefreshLayout; import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; /** * @author imgod * */ public class SwpipeListViewOnScrollListener implements AbsListView.OnScrollListener { private SwipeRefreshLayout mSwipeView; private AbsListView.OnScrollListener mOnScrollListener; public SwpipeListViewOnScrollListener(SwipeRefreshLayout swipeView) { mSwipeView = swipeView; } public SwpipeListViewOnScrollListener(SwipeRefreshLayout swipeView, OnScrollListener onScrollListener) { mSwipeView = swipeView; mOnScrollListener = onScrollListener; } @Override public void onScrollStateChanged(AbsListView absListView, int i) { } @Override public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { View firstView = absListView.getChildAt(firstVisibleItem); // 當firstVisibleItem是第0位。如果firstView==null說明列表為空,需要重新整理;或者top==0說明已經到達列表頂部, 也需要重新整理 if (firstVisibleItem == 0 && (firstView == null || firstView.getTop() == 0)) { mSwipeView.setEnabled(true); absListView.scrollTo(0, 0);// 當listview的item高度過大的話,可能依然會有尷尬,所以這裡我們判斷第一個顯示的時候,就挪到首位 } else { mSwipeView.setEnabled(false); } if (null != mOnScrollListener) { mOnScrollListener.onScroll(absListView, firstVisibleItem, visibleItemCount, totalItemCount); } } }
記錄一下,,,