1. 程式人生 > >android SwipeRefreshLayouth和ListView衝突解決

android SwipeRefreshLayouth和ListView衝突解決

在最近的專案中,遇到下拉重新整理的需求..第一時間就想到了谷歌自家的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);
		}
	}
}

記錄一下,,,