Skip to content

Commit 5537335

Browse files
author
Rafael Dominiquini
committed
ability to disable syicky headers
1 parent 065575a commit 5537335

File tree

5 files changed

+40
-26
lines changed

5 files changed

+40
-26
lines changed

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

Lines changed: 11 additions & 12 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,7 +123,7 @@ 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

@@ -138,18 +138,17 @@ private void initDefaultHeaderOffset(Rect headerMargins, RecyclerView recyclerVi
138138

139139
if (orientation == LinearLayoutManager.VERTICAL) {
140140
translationX = firstView.getLeft() - leftMargin + mTempRect1.left;
141-
translationY = Math.max(
142-
firstView.getTop() - topMargin - header.getHeight() - mTempRect1.bottom,
143-
getListTop(recyclerView) + mTempRect1.top);
141+
translationY = enableStickyHeader ?
142+
Math.max(firstView.getTop() - topMargin - header.getHeight() - mTempRect1.bottom, getListTop(recyclerView) + mTempRect1.top) :
143+
firstView.getTop() - topMargin - header.getHeight() - mTempRect1.bottom;
144144
} else {
145145
translationY = firstView.getTop() - topMargin + mTempRect1.top;
146-
translationX = Math.max(
147-
firstView.getLeft() - leftMargin - header.getWidth() - mTempRect1.right,
148-
getListLeft(recyclerView) + mTempRect1.left);
146+
translationX = enableStickyHeader ?
147+
Math.max(firstView.getLeft() - leftMargin - header.getWidth() - mTempRect1.right, getListLeft(recyclerView) + mTempRect1.left) :
148+
firstView.getLeft() - leftMargin - header.getWidth() - mTempRect1.right;
149149
}
150150

151-
headerMargins.set(translationX, translationY, translationX + header.getWidth(),
152-
translationY + header.getHeight());
151+
headerMargins.set(translationX, translationY, translationX + header.getWidth(), translationY + header.getHeight());
153152
}
154153

155154
private boolean isStickyHeaderBeingPushedOffscreen(RecyclerView recyclerView, View stickyHeader) {

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

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,45 +25,50 @@ public class StickyRecyclerHeadersDecoration extends RecyclerView.ItemDecoration
2525
private final HeaderRenderer mRenderer;
2626
private final DimensionCalculator mDimensionCalculator;
2727
private StickyRecyclerHeadersPositionChangeListener mHeaderListener;
28+
private boolean mEnableStickyHeader = true;
2829

2930
/**
3031
* The following field is used as a buffer for internal calculations. Its sole purpose is to avoid
3132
* allocating new Rect every time we need one.
3233
*/
3334
private final Rect mTempRect = new Rect();
3435

35-
// TODO: Consider passing in orientation to simplify orientation accounting within calculation
3636
public StickyRecyclerHeadersDecoration(StickyRecyclerHeadersAdapter adapter) {
37-
this(adapter, new LinearLayoutOrientationProvider(), new DimensionCalculator(), null);
37+
this(adapter, new LinearLayoutOrientationProvider(), new DimensionCalculator(), null, true);
3838
}
3939

40-
public StickyRecyclerHeadersDecoration(StickyRecyclerHeadersAdapter adapter, ItemVisibilityAdapter visibilityAdapter) {
41-
this(adapter, new LinearLayoutOrientationProvider(), new DimensionCalculator(), visibilityAdapter);
40+
public StickyRecyclerHeadersDecoration(StickyRecyclerHeadersAdapter adapter, boolean enableStickyHeader) {
41+
this(adapter, new LinearLayoutOrientationProvider(), new DimensionCalculator(), null, enableStickyHeader);
42+
}
43+
44+
public StickyRecyclerHeadersDecoration(StickyRecyclerHeadersAdapter adapter, ItemVisibilityAdapter visibilityAdapter, boolean enableStickyHeader) {
45+
this(adapter, new LinearLayoutOrientationProvider(), new DimensionCalculator(), visibilityAdapter, enableStickyHeader);
4246
}
4347

4448
private StickyRecyclerHeadersDecoration(StickyRecyclerHeadersAdapter adapter, OrientationProvider orientationProvider,
45-
DimensionCalculator dimensionCalculator, ItemVisibilityAdapter visibilityAdapter) {
49+
DimensionCalculator dimensionCalculator, ItemVisibilityAdapter visibilityAdapter, boolean enableStickyHeader) {
4650
this(adapter, orientationProvider, dimensionCalculator, new HeaderRenderer(orientationProvider),
47-
new HeaderViewCache(adapter, orientationProvider), visibilityAdapter);
51+
new HeaderViewCache(adapter, orientationProvider), visibilityAdapter, enableStickyHeader);
4852
}
4953

5054
private StickyRecyclerHeadersDecoration(StickyRecyclerHeadersAdapter adapter, OrientationProvider orientationProvider,
51-
DimensionCalculator dimensionCalculator, HeaderRenderer headerRenderer, HeaderProvider headerProvider, ItemVisibilityAdapter visibilityAdapter) {
55+
DimensionCalculator dimensionCalculator, HeaderRenderer headerRenderer, HeaderProvider headerProvider, ItemVisibilityAdapter visibilityAdapter, boolean enableStickyHeader) {
5256
this(adapter, headerRenderer, orientationProvider, dimensionCalculator, headerProvider,
5357
new HeaderPositionCalculator(adapter, headerProvider, orientationProvider,
54-
dimensionCalculator), visibilityAdapter);
58+
dimensionCalculator), visibilityAdapter, enableStickyHeader);
5559
}
5660

5761
private StickyRecyclerHeadersDecoration(StickyRecyclerHeadersAdapter adapter, HeaderRenderer headerRenderer,
5862
OrientationProvider orientationProvider, DimensionCalculator dimensionCalculator, HeaderProvider headerProvider,
59-
HeaderPositionCalculator headerPositionCalculator, ItemVisibilityAdapter visibilityAdapter) {
63+
HeaderPositionCalculator headerPositionCalculator, ItemVisibilityAdapter visibilityAdapter, boolean enableStickyHeader) {
6064
mAdapter = adapter;
6165
mHeaderProvider = headerProvider;
6266
mOrientationProvider = orientationProvider;
6367
mRenderer = headerRenderer;
6468
mDimensionCalculator = dimensionCalculator;
6569
mHeaderPositionCalculator = headerPositionCalculator;
6670
mVisibilityAdapter = visibilityAdapter;
71+
mEnableStickyHeader = enableStickyHeader;
6772
}
6873

6974
@Override
@@ -120,10 +125,10 @@ public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State st
120125
headerOffset = new Rect();
121126
mHeaderRects.put(position, headerOffset);
122127
}
123-
mHeaderPositionCalculator.initHeaderBounds(headerOffset, parent, header, itemView, hasStickyHeader);
128+
mHeaderPositionCalculator.initHeaderBounds(headerOffset, parent, header, itemView, hasStickyHeader, mEnableStickyHeader);
124129
mRenderer.drawHeader(parent, canvas, header, headerOffset);
125130

126-
if (mHeaderListener != null) {
131+
if (mEnableStickyHeader && mHeaderListener != null) {
127132
mHeaderListener.onHeaderPositionChanged(this, mAdapter.getHeaderId(position), header, position, headerOffset);
128133
}
129134
}
@@ -184,4 +189,12 @@ public void invalidateHeaders() {
184189
public void setHeaderPositionListener(StickyRecyclerHeadersPositionChangeListener headerListener) {
185190
this.mHeaderListener = headerListener;
186191
}
192+
193+
public void enableStickyHeaders(boolean enableStickyHeaders) {
194+
this.mEnableStickyHeader = enableStickyHeaders;
195+
}
196+
197+
public boolean isStickyHeadersEnabled() {
198+
return this.mEnableStickyHeader;
199+
}
187200
}

sample/src/main/java/com/timehop/stickyheadersrecyclerview/sample/MainActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public void run() {
6666
recyclerView.setLayoutManager(layoutManager);
6767

6868
// Add the sticky headers decoration
69-
final StickyRecyclerHeadersDecoration headersDecor = new StickyRecyclerHeadersDecoration(adapter);
69+
final StickyRecyclerHeadersDecoration headersDecor = new StickyRecyclerHeadersDecoration(adapter, true);
7070
recyclerView.addItemDecoration(headersDecor);
7171

7272
headersDecor.setHeaderPositionListener(new StickyRecyclerHeadersPositionChangeListener() {

sample/src/main/res/layout-land/view_header.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
android:layout_width="4dp"
2424
android:layout_height="match_parent"
2525
android:alpha="0.64"
26-
android:background="@drawable/shadow_vertical" />
26+
android:background="@drawable/shadow_vertical"
27+
android:visibility="invisible" />
2728

2829
</LinearLayout>

sample/src/main/res/layout/view_header.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
android:layout_width="wrap_content"
2424
android:layout_height="4dp"
2525
android:alpha="0.64"
26-
android:background="@drawable/shadow_horizontal" />
26+
android:background="@drawable/shadow_horizontal"
27+
android:visibility="invisible" />
2728

2829
</LinearLayout>

0 commit comments

Comments
 (0)