直接贴代码
private abstract class ListScrollDistanceCalculator implements AbsListView.OnScrollListener {
private boolean mListScrollStarted;
private int mFirstVisibleItem;
private int mFirstVisibleHeight;
private int mFirstVisibleTop, mFirstVisibleBottom;
private int mTotalScrollDistance;
private int mDelta;
private int headerHeight = 0;
private int headerTop = 0;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (view.getCount() == 0) return;
switch (scrollState) {
case SCROLL_STATE_IDLE:
mListScrollStarted = false;
break;
case SCROLL_STATE_TOUCH_SCROLL:
final View firstChild = view.getChildAt(0);
mFirstVisibleItem = view.getFirstVisiblePosition();
mFirstVisibleTop = firstChild.getTop();
mFirstVisibleBottom = firstChild.getBottom();
mFirstVisibleHeight = firstChild.getHeight();
mListScrollStarted = true;
mTotalScrollDistance = 0;
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (totalItemCount == 0 || !mListScrollStarted) return;
final View firstChild = view.getChildAt(0);
final int firstVisibleTop = firstChild.getTop(), firstVisibleBottom = firstChild.getBottom();
final int firstVisibleHeight = firstVisibleBottom - firstVisibleTop;
if(headerHeight == 0){
headerHeight = firstChild.getHeight();
headerTop = firstVisibleTop;
}
mDelta = 0;
if (firstVisibleItem > mFirstVisibleItem) {
mFirstVisibleTop += mFirstVisibleHeight;
mDelta = firstVisibleTop - mFirstVisibleTop;
} else if (firstVisibleItem < mFirstVisibleItem) {
mFirstVisibleBottom -= mFirstVisibleHeight;
mDelta = firstVisibleBottom - mFirstVisibleBottom;
} else {
mDelta = firstVisibleBottom - mFirstVisibleBottom;
}
mTotalScrollDistance += mDelta;
onScrollDistanceChanged(mDelta, mTotalScrollDistance);
mFirstVisibleTop = firstVisibleTop;
mFirstVisibleBottom = firstVisibleBottom;
mFirstVisibleHeight = firstVisibleHeight;
mFirstVisibleItem = firstVisibleItem;
}
public int getTotalScrollDistance() {
return mTotalScrollDistance;
}
public abstract void onScrollDistanceChanged(int delta, int total);
}