Skip to content

Commit 728994d

Browse files
author
Rafael Dominiquini
committed
Minor bug fixes and refactor
1 parent 5537335 commit 728994d

File tree

11 files changed

+62
-37
lines changed

11 files changed

+62
-37
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,14 @@ public void initHeaderBounds(Rect bounds, RecyclerView recyclerView, View header
123123
}
124124
}
125125

126+
public Rect getHeaderBounds(RecyclerView recyclerView, View header, View firstView, boolean firstHeader, boolean enableStickyHeader) {
127+
Rect rect = new Rect();
128+
129+
initHeaderBounds(rect, recyclerView, header, firstView, firstHeader, enableStickyHeader);
130+
131+
return rect;
132+
}
133+
126134
private void initDefaultHeaderOffset(Rect headerMargins, RecyclerView recyclerView, View header, View firstView, int orientation, boolean enableStickyHeader) {
127135
int translationX, translationY;
128136
mDimensionCalculator.initMargins(mTempRect1, header);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package com.timehop.stickyheadersrecyclerview;
22

33
/**
4-
* ItemVisibilityAdapter provides a way for StickyRecyclerHeadersDecoration
4+
* ItemVisibilityAdapter provides a way for StickyRecyclerLinearHeadersDecoration
55
* to know if a row is visible or not. This comes into play if the
66
* recyclerview's layout manager is set up to provide extra layout space (by
77
* overriding getExtraLayoutSpace). In this case rows that aren't visible (yet)
8-
* will be bound and StickyRecyclerHeadersDecoration will need to know which
8+
* will be bound and StickyRecyclerLinearHeadersDecoration will need to know which
99
* are visible to correctly calculate the row to base the sticky header on
1010
*
1111
* To use it you must pass an instance of a class that implements this
12-
* interface as a second argment StickyRecyclerHeadersDecoration's constructor.
12+
* interface as a second argment StickyRecyclerLinearHeadersDecoration's constructor.
1313
*
1414
*/
1515
public interface ItemVisibilityAdapter {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import android.graphics.Rect;
44
import android.view.View;
55

6+
import com.timehop.stickyheadersrecyclerview.decorators.StickyRecyclerHeadersDecoration;
7+
68
/**
79
* Created by Rafael Baboni Dominiquini on 13/04/16.
810
*/

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@
66
import android.view.SoundEffectConstants;
77
import android.view.View;
88

9+
import com.timehop.stickyheadersrecyclerview.decorators.StickyRecyclerHeadersDecoration;
10+
911
public class StickyRecyclerHeadersTouchListener implements RecyclerView.OnItemTouchListener {
12+
1013
private final GestureDetector mTapDetector;
1114
private final RecyclerView mRecyclerView;
15+
private final StickyRecyclerHeadersAdapter mAdapter;
1216
private final StickyRecyclerHeadersDecoration mDecor;
1317
private OnHeaderClickListener mOnHeaderClickListener;
1418

@@ -18,22 +22,22 @@ public interface OnHeaderClickListener {
1822

1923
public StickyRecyclerHeadersTouchListener(final RecyclerView recyclerView,
2024
final StickyRecyclerHeadersDecoration decor) {
25+
this(recyclerView, (StickyRecyclerHeadersAdapter) recyclerView.getAdapter(), decor);
26+
}
27+
28+
public StickyRecyclerHeadersTouchListener(final RecyclerView recyclerView,
29+
final StickyRecyclerHeadersAdapter adapter,
30+
final StickyRecyclerHeadersDecoration decor) {
2131
mTapDetector = new GestureDetector(recyclerView.getContext(), new SingleTapDetector());
2232
mRecyclerView = recyclerView;
33+
mAdapter = adapter;
2334
mDecor = decor;
2435
}
2536

2637
public StickyRecyclerHeadersAdapter getAdapter() {
27-
if (mRecyclerView.getAdapter() instanceof StickyRecyclerHeadersAdapter) {
28-
return (StickyRecyclerHeadersAdapter) mRecyclerView.getAdapter();
29-
} else {
30-
throw new IllegalStateException("A RecyclerView with " +
31-
StickyRecyclerHeadersTouchListener.class.getSimpleName() +
32-
" requires a " + StickyRecyclerHeadersAdapter.class.getSimpleName());
33-
}
38+
return mAdapter;
3439
}
3540

36-
3741
public void setOnHeaderClickListener(OnHeaderClickListener listener) {
3842
mOnHeaderClickListener = listener;
3943
}

library/src/main/java/com/timehop/stickyheadersrecyclerview/caching/HeaderViewCache.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ public View getHeader(RecyclerView parent, int position) {
3535
mAdapter.onBindHeaderViewHolder(viewHolder, position);
3636
header = viewHolder.itemView;
3737
if (header.getLayoutParams() == null) {
38-
header.setLayoutParams(new ViewGroup.LayoutParams(
39-
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
38+
header.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
4039
}
4140

4241
int widthSpec;

library/src/main/java/com/timehop/stickyheadersrecyclerview/calculation/DimensionCalculator.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public void initMargins(Rect margins, View view) {
2525
MarginLayoutParams marginLayoutParams = (MarginLayoutParams) layoutParams;
2626
initMarginRect(margins, marginLayoutParams);
2727
} else {
28-
margins.set(0, 0, 0, 0);
28+
margins.set(0, 0, 0, 0);
2929
}
3030
}
3131

@@ -45,4 +45,15 @@ private void initMarginRect(Rect marginRect, MarginLayoutParams marginLayoutPara
4545
);
4646
}
4747

48+
public Rect getMarginRect(View header) {
49+
Rect rect = new Rect();
50+
51+
if (header.getLayoutParams() instanceof MarginLayoutParams) {
52+
initMarginRect(rect, (MarginLayoutParams) header.getLayoutParams());
53+
} else {
54+
rect.set(0, 0, 0, 0);
55+
}
56+
57+
return rect;
58+
}
4859
}

library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersDecoration.java renamed to library/src/main/java/com/timehop/stickyheadersrecyclerview/decorators/StickyRecyclerHeadersDecoration.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.timehop.stickyheadersrecyclerview;
1+
package com.timehop.stickyheadersrecyclerview.decorators;
22

33
import android.graphics.Canvas;
44
import android.graphics.Rect;
@@ -7,6 +7,10 @@
77
import android.util.SparseArray;
88
import android.view.View;
99

10+
import com.timehop.stickyheadersrecyclerview.HeaderPositionCalculator;
11+
import com.timehop.stickyheadersrecyclerview.ItemVisibilityAdapter;
12+
import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter;
13+
import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersPositionChangeListener;
1014
import com.timehop.stickyheadersrecyclerview.caching.HeaderProvider;
1115
import com.timehop.stickyheadersrecyclerview.caching.HeaderViewCache;
1216
import com.timehop.stickyheadersrecyclerview.calculation.DimensionCalculator;
@@ -24,8 +28,9 @@ public class StickyRecyclerHeadersDecoration extends RecyclerView.ItemDecoration
2428
private final HeaderPositionCalculator mHeaderPositionCalculator;
2529
private final HeaderRenderer mRenderer;
2630
private final DimensionCalculator mDimensionCalculator;
31+
private final boolean mEnableStickyHeader;
32+
2733
private StickyRecyclerHeadersPositionChangeListener mHeaderListener;
28-
private boolean mEnableStickyHeader = true;
2934

3035
/**
3136
* The following field is used as a buffer for internal calculations. Its sole purpose is to avoid
@@ -46,21 +51,21 @@ public StickyRecyclerHeadersDecoration(StickyRecyclerHeadersAdapter adapter, Ite
4651
}
4752

4853
private StickyRecyclerHeadersDecoration(StickyRecyclerHeadersAdapter adapter, OrientationProvider orientationProvider,
49-
DimensionCalculator dimensionCalculator, ItemVisibilityAdapter visibilityAdapter, boolean enableStickyHeader) {
54+
DimensionCalculator dimensionCalculator, ItemVisibilityAdapter visibilityAdapter, boolean enableStickyHeader) {
5055
this(adapter, orientationProvider, dimensionCalculator, new HeaderRenderer(orientationProvider),
51-
new HeaderViewCache(adapter, orientationProvider), visibilityAdapter, enableStickyHeader);
56+
new HeaderViewCache(adapter, orientationProvider), visibilityAdapter, enableStickyHeader);
5257
}
5358

5459
private StickyRecyclerHeadersDecoration(StickyRecyclerHeadersAdapter adapter, OrientationProvider orientationProvider,
55-
DimensionCalculator dimensionCalculator, HeaderRenderer headerRenderer, HeaderProvider headerProvider, ItemVisibilityAdapter visibilityAdapter, boolean enableStickyHeader) {
60+
DimensionCalculator dimensionCalculator, HeaderRenderer headerRenderer, HeaderProvider headerProvider, ItemVisibilityAdapter visibilityAdapter, boolean enableStickyHeader) {
5661
this(adapter, headerRenderer, orientationProvider, dimensionCalculator, headerProvider,
57-
new HeaderPositionCalculator(adapter, headerProvider, orientationProvider,
58-
dimensionCalculator), visibilityAdapter, enableStickyHeader);
62+
new HeaderPositionCalculator(adapter, headerProvider, orientationProvider,
63+
dimensionCalculator), visibilityAdapter, enableStickyHeader);
5964
}
6065

6166
private StickyRecyclerHeadersDecoration(StickyRecyclerHeadersAdapter adapter, HeaderRenderer headerRenderer,
62-
OrientationProvider orientationProvider, DimensionCalculator dimensionCalculator, HeaderProvider headerProvider,
63-
HeaderPositionCalculator headerPositionCalculator, ItemVisibilityAdapter visibilityAdapter, boolean enableStickyHeader) {
67+
OrientationProvider orientationProvider, DimensionCalculator dimensionCalculator, HeaderProvider headerProvider,
68+
HeaderPositionCalculator headerPositionCalculator, ItemVisibilityAdapter visibilityAdapter, boolean enableStickyHeader) {
6469
mAdapter = adapter;
6570
mHeaderProvider = headerProvider;
6671
mOrientationProvider = orientationProvider;
@@ -76,7 +81,7 @@ public void getItemOffsets(Rect outRect, View view, RecyclerView parent, Recycle
7681
super.getItemOffsets(outRect, view, parent, state);
7782
int itemPosition = parent.getChildAdapterPosition(view);
7883
if (itemPosition == RecyclerView.NO_POSITION) {
79-
return;
84+
return;
8085
}
8186
if (mHeaderPositionCalculator.hasNewHeader(itemPosition, mOrientationProvider.isReverseLayout(parent))) {
8287
View header = getHeaderView(parent, itemPosition);
@@ -113,7 +118,7 @@ public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State st
113118
View itemView = parent.getChildAt(i);
114119
int position = parent.getChildAdapterPosition(itemView);
115120
if (position == RecyclerView.NO_POSITION) {
116-
continue;
121+
continue;
117122
}
118123

119124
boolean hasStickyHeader = mHeaderPositionCalculator.hasStickyHeader(itemView, mOrientationProvider.getOrientation(parent), position);
@@ -190,10 +195,6 @@ public void setHeaderPositionListener(StickyRecyclerHeadersPositionChangeListene
190195
this.mHeaderListener = headerListener;
191196
}
192197

193-
public void enableStickyHeaders(boolean enableStickyHeaders) {
194-
this.mEnableStickyHeader = enableStickyHeaders;
195-
}
196-
197198
public boolean isStickyHeadersEnabled() {
198199
return this.mEnableStickyHeader;
199200
}

library/src/main/java/com/timehop/stickyheadersrecyclerview/rendering/HeaderRenderer.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,5 +84,4 @@ private void initClipRectForHeader(Rect clipRect, RecyclerView recyclerView, Vie
8484
recyclerView.getHeight() - recyclerView.getPaddingBottom() - clipRect.bottom);
8585
}
8686
}
87-
8887
}

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import android.os.Handler;
99
import android.os.Looper;
1010
import android.support.v7.app.AppCompatActivity;
11+
import android.support.v7.widget.GridLayoutManager;
1112
import android.support.v7.widget.LinearLayoutManager;
1213
import android.support.v7.widget.RecyclerView;
1314
import android.util.Log;
@@ -20,14 +21,16 @@
2021
import android.widget.ToggleButton;
2122

2223
import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter;
23-
import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration;
2424
import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersPositionChangeListener;
2525
import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersTouchListener;
26+
import com.timehop.stickyheadersrecyclerview.decorators.StickyRecyclerHeadersDecoration;
2627

2728
import java.security.SecureRandom;
2829

2930
public class MainActivity extends AppCompatActivity {
3031

32+
public static final int NUM_COLUMNS = 1;
33+
3134
@Override
3235
protected void onCreate(Bundle savedInstanceState) {
3336
super.onCreate(savedInstanceState);
@@ -39,7 +42,7 @@ protected void onCreate(Bundle savedInstanceState) {
3942

4043
// Set adapter populated with example dummy data
4144
final AnimalsHeadersAdapter adapter = new AnimalsHeadersAdapter();
42-
adapter.add("Animals below!");
45+
adapter.add("List of Animals");
4346
adapter.addAll(getDummyDataSet());
4447
recyclerView.setAdapter(adapter);
4548

@@ -62,7 +65,7 @@ public void run() {
6265

6366
// Set layout manager
6467
int orientation = getLayoutManagerOrientation(getResources().getConfiguration().orientation);
65-
final LinearLayoutManager layoutManager = new LinearLayoutManager(this, orientation, isReverseButton.isChecked());
68+
final GridLayoutManager layoutManager = new GridLayoutManager(this, NUM_COLUMNS, orientation, isReverseButton.isChecked());
6669
recyclerView.setLayoutManager(layoutManager);
6770

6871
// Add the sticky headers decoration
@@ -136,8 +139,7 @@ private class AnimalsHeadersAdapter extends AnimalsAdapter<RecyclerView.ViewHold
136139
implements StickyRecyclerHeadersAdapter<RecyclerView.ViewHolder> {
137140
@Override
138141
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
139-
View view = LayoutInflater.from(parent.getContext())
140-
.inflate(R.layout.view_item, parent, false);
142+
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item, parent, false);
141143
return new RecyclerView.ViewHolder(view) {
142144
};
143145
}
@@ -159,8 +161,7 @@ public long getHeaderId(int position) {
159161

160162
@Override
161163
public RecyclerView.ViewHolder onCreateHeaderViewHolder(ViewGroup parent, int position) {
162-
View view = LayoutInflater.from(parent.getContext())
163-
.inflate(R.layout.view_header, parent, false);
164+
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_header, parent, false);
164165
return new RecyclerView.ViewHolder(view) {
165166
};
166167
}

0 commit comments

Comments
 (0)