计算ListView滚动的距离

来源:互联网 发布:现代进化论 知乎 编辑:程序博客网 时间:2024/05/18 03:20

直接贴代码

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);    }


1 0
原创粉丝点击