package com.roboo.like.google.views.helper; import android.app.Activity; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewParent; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.FrameLayout; import android.widget.GridView; import android.widget.ListView; import com.nineoldandroids.view.ViewPropertyAnimator; import com.roboo.like.google.staggeredgrid.StaggeredGridView; import com.roboo.like.google.views.StickyGridHeadersGridView; import com.roboo.like.google.views.StickyListHeadersListView; public class PoppyListViewHelper { public enum PoppyViewPosition { TOP, BOTTOM }; private static final int SCROLL_TO_TOP = -1; private static final int SCROLL_TO_BOTTOM = 1; private static final int SCROLL_DIRECTION_CHANGE_THRESHOLD = 5; private Activity mActivity; private LayoutInflater mLayoutInflater; private View mPoppyView; private int mScrollDirection = 0; private int mPoppyViewHeight = -1; private PoppyViewPosition mPoppyViewPosition; public PoppyListViewHelper(Activity activity, PoppyViewPosition position) { mActivity = activity; mLayoutInflater = LayoutInflater.from(activity); mPoppyViewPosition = position; } public PoppyListViewHelper(Activity activity) { this(activity, PoppyViewPosition.BOTTOM); } // for ListView public View createPoppyViewOnAbsListView(int listViewId, int poppyViewResId, OnScrollListener onScrollListener) { ListView listView = null; AbsListView view = (AbsListView) mActivity.findViewById(listViewId); if (view instanceof ListView) { listView = (ListView) view; } else if (view instanceof GridView) { } if (null != listView) { if (listView.getHeaderViewsCount() != 0) { throw new IllegalArgumentException("use createPoppyViewOnListView with headerResId parameter"); } if (listView.getFooterViewsCount() != 0) { throw new IllegalArgumentException("poppyview library doesn't support listview with footer"); } } mPoppyView = mLayoutInflater.inflate(poppyViewResId, null); initPoppyViewOnAbsListView(view, onScrollListener); return mPoppyView; } public View createPoppyViewOnListView(int listViewId, int poppyViewResId) { return createPoppyViewOnAbsListView(listViewId, poppyViewResId, null); } private void setPoppyViewOnView(View view) { LayoutParams lp = view.getLayoutParams(); ViewParent parent = view.getParent(); ViewGroup group = (ViewGroup) parent; int index = group.indexOfChild(view); final FrameLayout newContainer = new FrameLayout(mActivity); group.removeView(view); group.addView(newContainer, index, lp); newContainer.addView(view); final FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); layoutParams.gravity = mPoppyViewPosition == PoppyViewPosition.BOTTOM ? Gravity.BOTTOM : Gravity.TOP; if (isPlusMarginBottom(view)) { int bottomMargin = (int) (48 * mActivity.getResources().getDisplayMetrics().density); layoutParams.bottomMargin = bottomMargin; } newContainer.addView(mPoppyView, layoutParams); group.invalidate(); } private boolean isPlusMarginBottom(View view) { return view instanceof StickyListHeadersListView ||view instanceof StickyGridHeadersGridView || view instanceof StaggeredGridView; } private void onScrollPositionChanged(int oldScrollPosition, int newScrollPosition) { int newScrollDirection; System.out.println(oldScrollPosition + " ->" + newScrollPosition); if (newScrollPosition < oldScrollPosition) { newScrollDirection = SCROLL_TO_TOP; } else { newScrollDirection = SCROLL_TO_BOTTOM; } if (newScrollDirection != mScrollDirection) { mScrollDirection = newScrollDirection; translateYPoppyView(); } } private void translateYPoppyView() { mPoppyView.post(new Runnable() { public void run() { if (mPoppyViewHeight <= 0) { mPoppyViewHeight = mPoppyView.getHeight(); } int translationY = 0; switch (mPoppyViewPosition) { case BOTTOM: translationY = mScrollDirection == SCROLL_TO_TOP ? 0 : mPoppyViewHeight; break; case TOP: translationY = mScrollDirection == SCROLL_TO_TOP ? -mPoppyViewHeight : 0; break; } ViewPropertyAnimator.animate(mPoppyView).setDuration(300).translationY(translationY); } }); } private void initPoppyViewOnAbsListView(AbsListView listView, final OnScrollListener onScrollListener) { setPoppyViewOnView(listView); listView.setOnScrollListener(new OnScrollListener() { int mScrollPosition; public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (onScrollListener != null) { onScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } View topChild = view.getChildAt(0); int newScrollPosition = 0; if (topChild == null) { newScrollPosition = 0; } else { newScrollPosition = -topChild.getTop() + view.getFirstVisiblePosition() * topChild.getHeight(); } if (Math.abs(newScrollPosition - mScrollPosition) >= SCROLL_DIRECTION_CHANGE_THRESHOLD) { onScrollPositionChanged(mScrollPosition, newScrollPosition); } mScrollPosition = newScrollPosition; } public void onScrollStateChanged(AbsListView view, int scrollState) { if (onScrollListener != null) { onScrollListener.onScrollStateChanged(view, scrollState); } } }); } }