2121public class StickyRecyclerHeadersDecoration extends RecyclerView .ItemDecoration {
2222
2323 private final StickyRecyclerHeadersAdapter mAdapter ;
24- private final ItemVisibilityAdapter mVisibilityAdapter ;
2524 private final SparseArray <Rect > mHeaderRects = new SparseArray <>();
2625 private final HeaderProvider mHeaderProvider ;
2726 private final OrientationProvider mOrientationProvider ;
@@ -30,6 +29,7 @@ public class StickyRecyclerHeadersDecoration extends RecyclerView.ItemDecoration
3029 private final DimensionCalculator mDimensionCalculator ;
3130 private final boolean mEnableStickyHeader ;
3231
32+ private ItemVisibilityAdapter mVisibilityAdapter ;
3333 private StickyRecyclerHeadersPositionChangeListener mHeaderListener ;
3434
3535 /**
@@ -39,40 +39,28 @@ public class StickyRecyclerHeadersDecoration extends RecyclerView.ItemDecoration
3939 private final Rect mTempRect = new Rect ();
4040
4141 public StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter ) {
42- this (adapter , new LinearLayoutOrientationProvider (), new DimensionCalculator (), null , true );
42+ this (adapter , new LinearLayoutOrientationProvider (), new DimensionCalculator (), true );
4343 }
4444
4545 public StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter , boolean enableStickyHeader ) {
46- this (adapter , new LinearLayoutOrientationProvider (), new DimensionCalculator (), null , enableStickyHeader );
46+ this (adapter , new LinearLayoutOrientationProvider (), new DimensionCalculator (), enableStickyHeader );
4747 }
4848
49- public StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter , ItemVisibilityAdapter visibilityAdapter , boolean enableStickyHeader ) {
50- this (adapter , new LinearLayoutOrientationProvider ( ), new DimensionCalculator (), visibilityAdapter , enableStickyHeader );
49+ private StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter , OrientationProvider orientationProvider , DimensionCalculator dimensionCalculator , boolean enableStickyHeader ) {
50+ this (adapter , orientationProvider , dimensionCalculator , new HeaderRenderer ( orientationProvider ), new HeaderViewCache ( adapter , orientationProvider ) , enableStickyHeader );
5151 }
5252
53- private StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter , OrientationProvider orientationProvider ,
54- DimensionCalculator dimensionCalculator , ItemVisibilityAdapter visibilityAdapter , boolean enableStickyHeader ) {
55- this (adapter , orientationProvider , dimensionCalculator , new HeaderRenderer (orientationProvider ),
56- new HeaderViewCache (adapter , orientationProvider ), visibilityAdapter , enableStickyHeader );
53+ private StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter , OrientationProvider orientationProvider , DimensionCalculator dimensionCalculator , HeaderRenderer headerRenderer , HeaderProvider headerProvider , boolean enableStickyHeader ) {
54+ this (adapter , headerRenderer , orientationProvider , dimensionCalculator , headerProvider , new HeaderPositionCalculator (adapter , headerProvider , orientationProvider , dimensionCalculator ), enableStickyHeader );
5755 }
5856
59- private StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter , OrientationProvider orientationProvider ,
60- DimensionCalculator dimensionCalculator , HeaderRenderer headerRenderer , HeaderProvider headerProvider , ItemVisibilityAdapter visibilityAdapter , boolean enableStickyHeader ) {
61- this (adapter , headerRenderer , orientationProvider , dimensionCalculator , headerProvider ,
62- new HeaderPositionCalculator (adapter , headerProvider , orientationProvider ,
63- dimensionCalculator ), visibilityAdapter , enableStickyHeader );
64- }
65-
66- private StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter , HeaderRenderer headerRenderer ,
67- OrientationProvider orientationProvider , DimensionCalculator dimensionCalculator , HeaderProvider headerProvider ,
68- HeaderPositionCalculator headerPositionCalculator , ItemVisibilityAdapter visibilityAdapter , boolean enableStickyHeader ) {
57+ private StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter , HeaderRenderer headerRenderer , OrientationProvider orientationProvider , DimensionCalculator dimensionCalculator , HeaderProvider headerProvider , HeaderPositionCalculator headerPositionCalculator , boolean enableStickyHeader ) {
6958 mAdapter = adapter ;
7059 mHeaderProvider = headerProvider ;
7160 mOrientationProvider = orientationProvider ;
7261 mRenderer = headerRenderer ;
7362 mDimensionCalculator = dimensionCalculator ;
7463 mHeaderPositionCalculator = headerPositionCalculator ;
75- mVisibilityAdapter = visibilityAdapter ;
7664 mEnableStickyHeader = enableStickyHeader ;
7765 }
7866
@@ -116,20 +104,24 @@ public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State st
116104
117105 for (int i = 0 ; i < childCount ; i ++) {
118106 View itemView = parent .getChildAt (i );
107+
119108 int position = parent .getChildAdapterPosition (itemView );
120- if (position == RecyclerView .NO_POSITION ) {
109+
110+ if (position == RecyclerView .NO_POSITION || position % mAdapter .getNumColumns () > 0 ) {
121111 continue ;
122112 }
123113
124114 boolean hasStickyHeader = mHeaderPositionCalculator .hasStickyHeader (itemView , mOrientationProvider .getOrientation (parent ), position );
125115 if (hasStickyHeader || mHeaderPositionCalculator .hasNewHeader (position , mOrientationProvider .isReverseLayout (parent ))) {
126116 View header = mHeaderProvider .getHeader (parent , position );
117+
127118 //re-use existing Rect, if any.
128119 Rect headerOffset = mHeaderRects .get (position );
129120 if (headerOffset == null ) {
130121 headerOffset = new Rect ();
131122 mHeaderRects .put (position , headerOffset );
132123 }
124+
133125 mHeaderPositionCalculator .initHeaderBounds (headerOffset , parent , header , itemView , hasStickyHeader , mEnableStickyHeader );
134126 mRenderer .drawHeader (parent , canvas , header , headerOffset );
135127
@@ -191,6 +183,10 @@ public void invalidateHeaders() {
191183 mHeaderRects .clear ();
192184 }
193185
186+ public void setVisibilityAdapter (ItemVisibilityAdapter visibilityAdapter ) {
187+ this .mVisibilityAdapter = visibilityAdapter ;
188+ }
189+
194190 public void setHeaderPositionListener (StickyRecyclerHeadersPositionChangeListener headerListener ) {
195191 this .mHeaderListener = headerListener ;
196192 }
0 commit comments