1717public class StickyRecyclerHeadersDecoration extends RecyclerView .ItemDecoration {
1818
1919 private final StickyRecyclerHeadersAdapter mAdapter ;
20+ private final ItemVisibilityAdapter mVisibilityAdapter ;
2021 private final SparseArray <Rect > mHeaderRects = new SparseArray <>();
2122 private final HeaderProvider mHeaderProvider ;
2223 private final OrientationProvider mOrientationProvider ;
@@ -32,31 +33,36 @@ public class StickyRecyclerHeadersDecoration extends RecyclerView.ItemDecoration
3233
3334 // TODO: Consider passing in orientation to simplify orientation accounting within calculation
3435 public StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter ) {
35- this (adapter , new LinearLayoutOrientationProvider (), new DimensionCalculator ());
36+ this (adapter , new LinearLayoutOrientationProvider (), new DimensionCalculator (), null );
37+ }
38+
39+ public StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter , ItemVisibilityAdapter visibilityAdapter ) {
40+ this (adapter , new LinearLayoutOrientationProvider (), new DimensionCalculator (), visibilityAdapter );
3641 }
3742
3843 private StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter , OrientationProvider orientationProvider ,
39- DimensionCalculator dimensionCalculator ) {
44+ DimensionCalculator dimensionCalculator , ItemVisibilityAdapter visibilityAdapter ) {
4045 this (adapter , orientationProvider , dimensionCalculator , new HeaderRenderer (orientationProvider ),
41- new HeaderViewCache (adapter , orientationProvider ));
46+ new HeaderViewCache (adapter , orientationProvider ), visibilityAdapter );
4247 }
4348
4449 private StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter , OrientationProvider orientationProvider ,
45- DimensionCalculator dimensionCalculator , HeaderRenderer headerRenderer , HeaderProvider headerProvider ) {
50+ DimensionCalculator dimensionCalculator , HeaderRenderer headerRenderer , HeaderProvider headerProvider , ItemVisibilityAdapter visibilityAdapter ) {
4651 this (adapter , headerRenderer , orientationProvider , dimensionCalculator , headerProvider ,
4752 new HeaderPositionCalculator (adapter , headerProvider , orientationProvider ,
48- dimensionCalculator ));
53+ dimensionCalculator ), visibilityAdapter );
4954 }
5055
5156 private StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter , HeaderRenderer headerRenderer ,
5257 OrientationProvider orientationProvider , DimensionCalculator dimensionCalculator , HeaderProvider headerProvider ,
53- HeaderPositionCalculator headerPositionCalculator ) {
58+ HeaderPositionCalculator headerPositionCalculator , ItemVisibilityAdapter visibilityAdapter ) {
5459 mAdapter = adapter ;
5560 mHeaderProvider = headerProvider ;
5661 mOrientationProvider = orientationProvider ;
5762 mRenderer = headerRenderer ;
5863 mDimensionCalculator = dimensionCalculator ;
5964 mHeaderPositionCalculator = headerPositionCalculator ;
65+ mVisibilityAdapter = visibilityAdapter ;
6066 }
6167
6268 @ Override
@@ -130,7 +136,10 @@ public int findHeaderPositionUnder(int x, int y) {
130136 for (int i = 0 ; i < mHeaderRects .size (); i ++) {
131137 Rect rect = mHeaderRects .get (mHeaderRects .keyAt (i ));
132138 if (rect .contains (x , y )) {
133- return mHeaderRects .keyAt (i );
139+ int position = mHeaderRects .keyAt (i );
140+ if (mVisibilityAdapter == null || mVisibilityAdapter .isPositionVisible (position )) {
141+ return position ;
142+ }
134143 }
135144 }
136145 return -1 ;
0 commit comments