2121public class StickyRecyclerHeadersDecoration extends RecyclerView .ItemDecoration {
2222
2323 private final StickyRecyclerHeadersAdapter mAdapter ;
24- private final SparseArray <Rect > mHeaderRects = new SparseArray <>();
2524 private final HeaderProvider mHeaderProvider ;
2625 private final OrientationProvider mOrientationProvider ;
2726 private final HeaderPositionCalculator mHeaderPositionCalculator ;
@@ -36,6 +35,7 @@ public class StickyRecyclerHeadersDecoration extends RecyclerView.ItemDecoration
3635 * The following field is used as a buffer for internal calculations. Its sole purpose is to avoid
3736 * allocating new Rect every time we need one.
3837 */
38+ private final SparseArray <Rect > mHeaderRects = new SparseArray <>();
3939 private final Rect mTempRect = new Rect ();
4040
4141 public StickyRecyclerHeadersDecoration (StickyRecyclerHeadersAdapter adapter ) {
@@ -109,26 +109,26 @@ public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State st
109109
110110 int position = parent .getChildAdapterPosition (itemView );
111111
112- if (position == RecyclerView .NO_POSITION || position % (mAdapter .getNumColumns () - mAdapter .getSpanSize (position ) + 1 ) > 0 ) {
113- continue ;
114- }
112+ int columnOfItem = position % (mAdapter .getNumColumns () - mAdapter .getSpanSize (position ) + 1 );
113+ if (position != RecyclerView .NO_POSITION && columnOfItem == 0 ) {
114+ boolean hasStickyHeader = mHeaderPositionCalculator .hasStickyHeader (itemView , mOrientationProvider .getOrientation (parent ), position );
115+ boolean hasNewHeader = mHeaderPositionCalculator .hasNewHeader (position , mOrientationProvider .isReverseLayout (parent ));
115116
116- boolean hasStickyHeader = mHeaderPositionCalculator .hasStickyHeader (itemView , mOrientationProvider .getOrientation (parent ), position );
117- boolean hasNewHeader = mHeaderPositionCalculator .hasNewHeader (position , mOrientationProvider .isReverseLayout (parent ));
118- if (hasStickyHeader || hasNewHeader ) {
119- View header = mHeaderProvider .getHeader (parent , position );
117+ if (hasStickyHeader || hasNewHeader ) {
118+ View header = mHeaderProvider .getHeader (parent , position );
120119
121- //re-use existing Rect, if any.
122- Rect headerOffset = mHeaderRects .get (position );
123- if (headerOffset == null ) {
124- mHeaderRects .put (position , headerOffset = new Rect ());
125- }
120+ //re-use existing Rect, if any.
121+ Rect headerOffset = mHeaderRects .get (position );
122+ if (headerOffset == null ) {
123+ mHeaderRects .put (position , headerOffset = new Rect ());
124+ }
126125
127- mHeaderPositionCalculator .initHeaderBounds (headerOffset , parent , header , itemView , hasStickyHeader , mEnableStickyHeader );
128- mRenderer .drawHeader (parent , canvas , header , headerOffset );
126+ mHeaderPositionCalculator .initHeaderBounds (headerOffset , parent , header , itemView , hasStickyHeader , mEnableStickyHeader );
127+ mRenderer .drawHeader (parent , canvas , header , headerOffset );
129128
130- if (mEnableStickyHeader && mHeaderListener != null ) {
131- mHeaderListener .onHeaderPositionChanged (this , mAdapter .getHeaderId (position ), header , position , headerOffset );
129+ if (mEnableStickyHeader && mHeaderListener != null ) {
130+ mHeaderListener .onHeaderPositionChanged (this , mAdapter .getHeaderId (position ), header , position , headerOffset );
131+ }
132132 }
133133 }
134134 }
@@ -177,7 +177,7 @@ public View getHeaderView(RecyclerView parent, int position) {
177177 }
178178
179179 /**
180- * Invalidates cached headers. This does not invalidate the recyclerview, you should do that manually after
180+ * Invalidates cached headers. This does not invalidate the recyclerview, you should do that manually after
181181 * calling this method.
182182 */
183183 public void invalidateHeaders () {
0 commit comments