package com.yzy.supercleanmaster.widget.stickyheader; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; public abstract class StikkyHeader { protected Context mContext; protected View mHeader; protected int mMinHeightHeader; protected HeaderAnimator mHeaderAnimator; protected int mHeightHeader; protected int mMaxHeaderTransaction; protected View mFakeHeader; protected void measureHeaderHeight() { int height = mHeader.getHeight(); if (height == 0) { //waiting for the height mHeader.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int height = mHeader.getHeight(); if (height > 0) { mHeader.getViewTreeObserver().removeGlobalOnLayoutListener(this); setHeightHeader(height); } } }); } else { setHeightHeader(height); } } protected void setHeightHeader(final int heightHeader) { mHeightHeader = heightHeader; // some implementations dont use a fake header if (mFakeHeader != null) { ViewGroup.LayoutParams lpFakeHeader = mFakeHeader.getLayoutParams(); lpFakeHeader.height = mHeightHeader; mFakeHeader.setLayoutParams(lpFakeHeader); } ViewGroup.LayoutParams lpHeader = mHeader.getLayoutParams(); lpHeader.height = mHeightHeader; mHeader.setLayoutParams(lpHeader); calculateMaxTransaction(); setupAnimator(); // update heights } private void calculateMaxTransaction() { mMaxHeaderTransaction = mMinHeightHeader - mHeightHeader; } protected void setupAnimator() { mHeaderAnimator.setupAnimator(mHeader, mMinHeightHeader, mHeightHeader, mMaxHeaderTransaction); } public void setMinHeightHeader(int minHeightHeader) { this.mMinHeightHeader = minHeightHeader; calculateMaxTransaction(); } }