diff --git a/library/src/main/java/com/timehop/stickyheadersrecyclerview/HeaderPositionCalculator.java b/library/src/main/java/com/timehop/stickyheadersrecyclerview/HeaderPositionCalculator.java index 3b26de6..dd24632 100644 --- a/library/src/main/java/com/timehop/stickyheadersrecyclerview/HeaderPositionCalculator.java +++ b/library/src/main/java/com/timehop/stickyheadersrecyclerview/HeaderPositionCalculator.java @@ -36,6 +36,18 @@ public HeaderPositionCalculator(StickyRecyclerHeadersAdapter adapter, HeaderProv mDimensionCalculator = dimensionCalculator; } + /** + * Listener for stick-headers' changing events + */ + public interface StickHeaderChangedListerner { + void onStickHeaderChanged(View newHeader,View oldHeader); + + } + private StickHeaderChangedListerner mListener; + public void setHeaderChangedListener(StickHeaderChangedListerner listener) { + this.mListener = listener; + } + /** * Determines if a view should have a sticky header. * The view has a sticky header if: @@ -105,6 +117,12 @@ public void initHeaderBounds(Rect bounds, RecyclerView recyclerView, View header translateHeaderWithNextHeader(recyclerView, mOrientationProvider.getOrientation(recyclerView), bounds, header, viewAfterNextHeader, secondHeader); } + + if(firstHeader && !isStickyHeaderBeingPushedOffscreen(recyclerView,header)){ + if(null!=mListener){ + mListener.onStickHeaderChanged(header, null); + } + } } private void initDefaultHeaderOffset(Rect headerMargins, RecyclerView recyclerView, View header, View firstView, int orientation) { @@ -153,13 +171,29 @@ private boolean isStickyHeaderBeingPushedOffscreen(RecyclerView recyclerView, Vi int topOfNextHeader = viewAfterHeader.getTop() - mTempRect1.bottom - nextHeader.getHeight() - mTempRect1.top; int bottomOfThisHeader = recyclerView.getPaddingTop() + stickyHeader.getBottom() + mTempRect2.top + mTempRect2.bottom; if (topOfNextHeader < bottomOfThisHeader) { + if (null != mListener) { + mListener.onStickHeaderChanged(nextHeader, stickyHeader); + } + return true; + }else{ + if (null != mListener) { + mListener.onStickHeaderChanged(stickyHeader, nextHeader); + } } } else { int leftOfNextHeader = viewAfterHeader.getLeft() - mTempRect1.right - nextHeader.getWidth() - mTempRect1.left; int rightOfThisHeader = recyclerView.getPaddingLeft() + stickyHeader.getRight() + mTempRect2.left + mTempRect2.right; if (leftOfNextHeader < rightOfThisHeader) { + if (null != mListener) { + mListener.onStickHeaderChanged(nextHeader, stickyHeader); + } + return true; + }else{ + if (null != mListener) { + mListener.onStickHeaderChanged(stickyHeader, nextHeader); + } } } } diff --git a/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersDecoration.java b/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersDecoration.java index 4673f8c..2bcca90 100644 --- a/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersDecoration.java +++ b/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersDecoration.java @@ -65,6 +65,18 @@ private StickyRecyclerHeadersDecoration(StickyRecyclerHeadersAdapter adapter, He mVisibilityAdapter = visibilityAdapter; } + /** + * set listener for stick-headers' changed events + * + * @param listener + */ + public void setOnStickHeaderChangedListener( + HeaderPositionCalculator.StickHeaderChangedListerner listener) { + if (null != mHeaderPositionCalculator) { + mHeaderPositionCalculator.setHeaderChangedListener(listener); + } + } + @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); diff --git a/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersTouchListener.java b/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersTouchListener.java index 4a093ed..a774ace 100644 --- a/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersTouchListener.java +++ b/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersTouchListener.java @@ -13,7 +13,7 @@ public class StickyRecyclerHeadersTouchListener implements RecyclerView.OnItemTo private OnHeaderClickListener mOnHeaderClickListener; public interface OnHeaderClickListener { - void onHeaderClick(View header, int position, long headerId); + void onHeaderClick(View header, int position, long headerId, boolean currentSticky); } public StickyRecyclerHeadersTouchListener(final RecyclerView recyclerView, @@ -68,7 +68,19 @@ public boolean onSingleTapUp(MotionEvent e) { if (position != -1) { View headerView = mDecor.getHeaderView(mRecyclerView, position); long headerId = getAdapter().getHeaderId(position); - mOnHeaderClickListener.onHeaderClick(headerView, position, headerId); + + float recylerX = mRecyclerView.getX(); + float recylerY = mRecyclerView.getY(); + + float headerWidth = headerView.getWidth(); + float headerHeight = headerView.getHeight(); + + boolean sticky = false; + if (e.getX() - recylerX <= headerWidth && e.getY() - recylerY < headerHeight) { + sticky = true; + } + + mOnHeaderClickListener.onHeaderClick(headerView, position, headerId, sticky); mRecyclerView.playSoundEffect(SoundEffectConstants.CLICK); headerView.onTouchEvent(e); return true; diff --git a/sample/src/main/java/com/timehop/stickyheadersrecyclerview/sample/MainActivity.java b/sample/src/main/java/com/timehop/stickyheadersrecyclerview/sample/MainActivity.java index 591bd10..a34db99 100644 --- a/sample/src/main/java/com/timehop/stickyheadersrecyclerview/sample/MainActivity.java +++ b/sample/src/main/java/com/timehop/stickyheadersrecyclerview/sample/MainActivity.java @@ -16,6 +16,7 @@ import android.widget.Toast; import android.widget.ToggleButton; +import com.timehop.stickyheadersrecyclerview.HeaderPositionCalculator; import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter; import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration; import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersTouchListener; @@ -63,6 +64,13 @@ public void run() { // Add the sticky headers decoration final StickyRecyclerHeadersDecoration headersDecor = new StickyRecyclerHeadersDecoration(adapter); + headersDecor.setOnStickHeaderChangedListener( + new HeaderPositionCalculator.StickHeaderChangedListerner() { + @Override + public void onStickHeaderChanged(View newHeader, View oldHeader) { + + } + }); recyclerView.addItemDecoration(headersDecor); // Add decoration for dividers between list items @@ -74,8 +82,8 @@ public void run() { touchListener.setOnHeaderClickListener( new StickyRecyclerHeadersTouchListener.OnHeaderClickListener() { @Override - public void onHeaderClick(View header, int position, long headerId) { - Toast.makeText(MainActivity.this, "Header position: " + position + ", id: " + headerId, + public void onHeaderClick(View header, int position, long headerId, boolean currentSticky) { + Toast.makeText(MainActivity.this, "Header position: " + position + ", id: " + headerId +", stick: "+ currentSticky, Toast.LENGTH_SHORT).show(); } });