计算ListView滚动的距离

直接贴代码

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值