package com.yzy.supercleanmaster.widget.stickyheader; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.ListView; public class StikkyHeaderListView extends StikkyHeader { private final ListView mListView; private AbsListView.OnScrollListener mDelegateOnScrollListener; StikkyHeaderListView(final Context context, final ListView listView, final View header, final int mMinHeightHeader, final HeaderAnimator headerAnimator) { this.mContext = context; this.mListView = listView; this.mHeader = header; this.mMinHeightHeader = mMinHeightHeader; this.mHeaderAnimator = headerAnimator; init(); } private void init() { createFakeHeader(); measureHeaderHeight(); setupAnimator(); setStickyOnScrollListener(); } protected void createFakeHeader() { mFakeHeader = new View(mContext); mFakeHeader.setVisibility(View.INVISIBLE); AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0); mFakeHeader.setLayoutParams(lp); mListView.addHeaderView(mFakeHeader); } private void setStickyOnScrollListener() { StickyOnScrollListener mStickyOnScrollListener = new StickyOnScrollListener(); mListView.setOnScrollListener(mStickyOnScrollListener); } private class StickyOnScrollListener implements AbsListView.OnScrollListener { private int mScrolledYList = 0; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (mDelegateOnScrollListener != null) { mDelegateOnScrollListener.onScrollStateChanged(view, scrollState); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { mScrolledYList = -calculateScrollYList(); //notify the animator mHeaderAnimator.onScroll(mScrolledYList); if (mDelegateOnScrollListener != null) { mDelegateOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } } private int calculateScrollYList() { View c = mListView.getChildAt(0); if (c == null) { return 0; } //TODO support more than 1 header? int firstVisiblePosition = mListView.getFirstVisiblePosition(); int top = c.getTop(); int headerHeight = 0; if (firstVisiblePosition >= 1) { //TODO >= number of header headerHeight = mHeightHeader; } return -top + firstVisiblePosition * c.getHeight() + headerHeight; } } public void setOnScrollListener(final AbsListView.OnScrollListener onScrollListener) { mDelegateOnScrollListener = onScrollListener; } }