Skip to content
This repository has been archived by the owner on Mar 24, 2023. It is now read-only.

[Feature] 'currentSticky' && OnStickHeaderChanged() #127

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand All @@ -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();
}
});
Expand Down