Skip to content

Commit b1af2fd

Browse files
committed
ability to disable syicky headers.
1 parent c311b97 commit b1af2fd

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

library/src/main/java/com/timehop/stickyheadersrecyclerview/HeaderPositionCalculator.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,11 @@ public boolean headerObscuringSomeItem(RecyclerView parent, View firstHeader) {
110110
return false;
111111
}
112112

113-
public void initHeaderBounds(Rect bounds, RecyclerView recyclerView, View header, View firstView, boolean firstHeader) {
113+
public void initHeaderBounds(Rect bounds, RecyclerView recyclerView, View header, View firstView, boolean firstHeader, boolean enableStickyHeader) {
114114
int orientation = mOrientationProvider.getOrientation(recyclerView);
115-
initDefaultHeaderOffset(bounds, recyclerView, header, firstView, orientation);
115+
initDefaultHeaderOffset(bounds, recyclerView, header, firstView, orientation, enableStickyHeader);
116116

117-
if (firstHeader && isStickyHeaderBeingPushedOffscreen(recyclerView, header)) {
117+
if (enableStickyHeader && firstHeader && isStickyHeaderBeingPushedOffscreen(recyclerView, header)) {
118118
View viewAfterNextHeader = getFirstViewUnobscuredByHeader(recyclerView, header);
119119
int firstViewUnderHeaderPosition = recyclerView.getChildAdapterPosition(viewAfterNextHeader);
120120
View secondHeader = mHeaderProvider.getHeader(recyclerView, firstViewUnderHeaderPosition);
@@ -123,19 +123,19 @@ public void initHeaderBounds(Rect bounds, RecyclerView recyclerView, View header
123123
}
124124
}
125125

126-
private void initDefaultHeaderOffset(Rect headerMargins, RecyclerView recyclerView, View header, View firstView, int orientation) {
126+
private void initDefaultHeaderOffset(Rect headerMargins, RecyclerView recyclerView, View header, View firstView, int orientation, boolean enableStickyHeader) {
127127
int translationX, translationY;
128128
mDimensionCalculator.initMargins(mTempRect1, header);
129129
if (orientation == LinearLayoutManager.VERTICAL) {
130130
translationX = firstView.getLeft() + mTempRect1.left;
131-
translationY = Math.max(
132-
firstView.getTop() - header.getHeight() - mTempRect1.bottom,
133-
getListTop(recyclerView) + mTempRect1.top);
131+
translationY = enableStickyHeader ?
132+
Math.max(firstView.getTop() - header.getHeight() - mTempRect1.bottom, getListTop(recyclerView) + mTempRect1.top) :
133+
firstView.getTop() - header.getHeight() - mTempRect1.bottom;
134134
} else {
135135
translationY = firstView.getTop() + mTempRect1.top;
136-
translationX = Math.max(
137-
firstView.getLeft() - header.getWidth() - mTempRect1.right,
138-
getListLeft(recyclerView) + mTempRect1.left);
136+
translationX = enableStickyHeader ?
137+
Math.max(firstView.getLeft() - header.getWidth() - mTempRect1.right, getListLeft(recyclerView) + mTempRect1.left) :
138+
firstView.getLeft() - header.getWidth() - mTempRect1.right;
139139
}
140140

141141
headerMargins.set(translationX, translationY, translationX + header.getWidth(),

library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersDecoration.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,17 @@ public class StickyRecyclerHeadersDecoration extends RecyclerView.ItemDecoration
2323
private final HeaderPositionCalculator mHeaderPositionCalculator;
2424
private final HeaderRenderer mRenderer;
2525
private final DimensionCalculator mDimensionCalculator;
26+
2627
/**
2728
* The following field is used as a buffer for internal calculations. Its sole purpose is to avoid
2829
* allocating new Rect every time we need one.
2930
*/
3031
private final Rect mTempRect = new Rect();
32+
3133
private StickyRecyclerHeadersPositionChangeListener mHeaderListener;
3234

35+
private boolean mEnableStickyHeader = true;
36+
3337
// TODO: Consider passing in orientation to simplify orientation accounting within calculation
3438
public StickyRecyclerHeadersDecoration(StickyRecyclerHeadersAdapter adapter) {
3539
this(adapter, new LinearLayoutOrientationProvider(), new DimensionCalculator());
@@ -113,10 +117,11 @@ public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State st
113117
headerOffset = new Rect();
114118
mHeaderRects.put(position, headerOffset);
115119
}
116-
mHeaderPositionCalculator.initHeaderBounds(headerOffset, parent, header, itemView, hasStickyHeader);
120+
121+
mHeaderPositionCalculator.initHeaderBounds(headerOffset, parent, header, itemView, hasStickyHeader, mEnableStickyHeader);
117122
mRenderer.drawHeader(parent, canvas, header, headerOffset);
118123

119-
if (mHeaderListener != null) {
124+
if (mEnableStickyHeader && mHeaderListener != null) {
120125
mHeaderListener.onHeaderPositionChanged(mAdapter.getHeaderId(position), header, position, headerOffset);
121126
}
122127
}
@@ -170,6 +175,14 @@ public void invalidateHeaders() {
170175
mHeaderProvider.invalidate();
171176
}
172177

178+
public void enableStickyHeaders(boolean enableStickyHeaders) {
179+
this.mEnableStickyHeader = enableStickyHeaders;
180+
}
181+
182+
public boolean isStickyHeadersEnabled() {
183+
return this.mEnableStickyHeader;
184+
}
185+
173186
public void setHeaderPositionListener(StickyRecyclerHeadersPositionChangeListener headerListener) {
174187
this.mHeaderListener = headerListener;
175188
}

0 commit comments

Comments
 (0)