@@ -21,13 +21,6 @@ public class HeaderPositionCalculator {
2121 private final HeaderProvider mHeaderProvider ;
2222 private final DimensionCalculator mDimensionCalculator ;
2323
24- /**
25- * The following fields are used as buffers for internal calculations. Their sole purpose is to avoid
26- * allocating new Rect every time we need one.
27- */
28- private final Rect mTempRect1 = new Rect ();
29- private final Rect mTempRect2 = new Rect ();
30-
3124 public HeaderPositionCalculator (StickyRecyclerHeadersAdapter adapter , HeaderProvider headerProvider , OrientationProvider orientationProvider , DimensionCalculator dimensionCalculator ) {
3225 mAdapter = adapter ;
3326 mHeaderProvider = headerProvider ;
@@ -49,15 +42,15 @@ public HeaderPositionCalculator(StickyRecyclerHeadersAdapter adapter, HeaderProv
4942 public boolean hasStickyHeader (View itemView , int orientation , int position ) {
5043 int offset , margin ;
5144
52- mDimensionCalculator .initMargins (mTempRect1 , itemView );
53-
5445 if (itemView != null ) {
46+ Rect rect = mDimensionCalculator .getMargins (itemView );
47+
5548 if (orientation == LinearLayout .VERTICAL ) {
5649 offset = itemView .getTop ();
57- margin = mTempRect1 .top ;
50+ margin = rect .top ;
5851 } else {
5952 offset = itemView .getLeft ();
60- margin = mTempRect1 .left ;
53+ margin = rect .left ;
6154 }
6255 } else {
6356 offset = -1 ;
@@ -127,30 +120,25 @@ public boolean headerObscuringSomeItem(RecyclerView parent, View firstHeader) {
127120 return false ;
128121 }
129122
130- public void initHeaderBounds ( Rect bounds , RecyclerView recyclerView , View header , View firstView , boolean firstHeader , boolean enableStickyHeader ) {
123+ public Rect getHeaderBounds ( RecyclerView recyclerView , View header , View firstView , boolean firstHeader , boolean enableStickyHeader ) {
131124 int orientation = mOrientationProvider .getOrientation (recyclerView );
132- initDefaultHeaderOffset (bounds , recyclerView , header , firstView , orientation , enableStickyHeader );
125+
126+ Rect bounds = getDefaultHeaderOffset (recyclerView , header , firstView , orientation , enableStickyHeader );
133127
134128 if (enableStickyHeader && firstHeader && isStickyHeaderBeingPushedOffscreen (recyclerView , header )) {
135129 View viewAfterNextHeader = getFirstViewUnobscuredByHeader (recyclerView , header );
136130 int firstViewUnderHeaderPosition = recyclerView .getChildAdapterPosition (viewAfterNextHeader );
137131 View secondHeader = mHeaderProvider .getHeader (recyclerView , firstViewUnderHeaderPosition );
138132 translateHeaderWithNextHeader (recyclerView , mOrientationProvider .getOrientation (recyclerView ), bounds , header , viewAfterNextHeader , secondHeader );
139133 }
140- }
141-
142- public Rect getHeaderBounds (RecyclerView recyclerView , View header , View firstView , boolean firstHeader , boolean enableStickyHeader ) {
143- Rect rect = new Rect ();
144-
145- initHeaderBounds (rect , recyclerView , header , firstView , firstHeader , enableStickyHeader );
146134
147- return rect ;
135+ return bounds ;
148136 }
149137
150- private void initDefaultHeaderOffset ( Rect headerMargins , RecyclerView recyclerView , View header , View firstView , int orientation , boolean enableStickyHeader ) {
138+ private Rect getDefaultHeaderOffset ( RecyclerView recyclerView , View header , View firstView , int orientation , boolean enableStickyHeader ) {
151139 int translationX , translationY ;
152140
153- mDimensionCalculator .initMargins ( mTempRect1 , header );
141+ Rect headerMargins = mDimensionCalculator .getMargins ( header );
154142
155143 if (header != null && firstView != null ) {
156144 ViewGroup .LayoutParams layoutParams = firstView .getLayoutParams ();
@@ -163,18 +151,20 @@ private void initDefaultHeaderOffset(Rect headerMargins, RecyclerView recyclerVi
163151 }
164152
165153 if (orientation == LinearLayoutManager .VERTICAL ) {
166- translationX = firstView .getLeft () - leftMargin + mTempRect1 .left ;
154+ translationX = firstView .getLeft () - leftMargin + headerMargins .left ;
167155 translationY = enableStickyHeader ?
168- Math .max (firstView .getTop () - topMargin - header .getHeight () - mTempRect1 .bottom , getListTop (recyclerView ) + mTempRect1 .top ) :
169- firstView .getTop () - topMargin - header .getHeight () - mTempRect1 .bottom ;
156+ Math .max (firstView .getTop () - topMargin - header .getHeight () - headerMargins .bottom , getListTop (recyclerView ) + headerMargins .top ) :
157+ firstView .getTop () - topMargin - header .getHeight () - headerMargins .bottom ;
170158 } else {
171- translationY = firstView .getTop () - topMargin + mTempRect1 .top ;
159+ translationY = firstView .getTop () - topMargin + headerMargins .top ;
172160 translationX = enableStickyHeader ?
173- Math .max (firstView .getLeft () - leftMargin - header .getWidth () - mTempRect1 .right , getListLeft (recyclerView ) + mTempRect1 .left ) :
174- firstView .getLeft () - leftMargin - header .getWidth () - mTempRect1 .right ;
161+ Math .max (firstView .getLeft () - leftMargin - header .getWidth () - headerMargins .right , getListLeft (recyclerView ) + headerMargins .left ) :
162+ firstView .getLeft () - leftMargin - header .getWidth () - headerMargins .right ;
175163 }
176164
177- headerMargins .set (translationX , translationY , translationX + header .getWidth (), translationY + header .getHeight ());
165+ return new Rect (translationX , translationY , translationX + header .getWidth (), translationY + header .getHeight ());
166+ } else {
167+ return headerMargins ;
178168 }
179169 }
180170
@@ -189,18 +179,18 @@ private boolean isStickyHeaderBeingPushedOffscreen(RecyclerView recyclerView, Vi
189179 boolean isReverseLayout = mOrientationProvider .isReverseLayout (recyclerView );
190180 if (firstViewUnderHeaderPosition > 0 && hasNewHeader (firstViewUnderHeaderPosition , isReverseLayout )) {
191181 View nextHeader = mHeaderProvider .getHeader (recyclerView , firstViewUnderHeaderPosition );
192- mDimensionCalculator .initMargins ( mTempRect1 , nextHeader );
193- mDimensionCalculator .initMargins ( mTempRect2 , stickyHeader );
182+ Rect nextHeaderMargins = mDimensionCalculator .getMargins ( nextHeader );
183+ Rect headerMargins = mDimensionCalculator .getMargins ( stickyHeader );
194184
195185 if (mOrientationProvider .getOrientation (recyclerView ) == LinearLayoutManager .VERTICAL ) {
196- int topOfNextHeader = viewAfterHeader .getTop () - mTempRect1 .bottom - nextHeader .getHeight () - mTempRect1 .top ;
197- int bottomOfThisHeader = recyclerView .getPaddingTop () + stickyHeader .getBottom () + mTempRect2 .top + mTempRect2 .bottom ;
186+ int topOfNextHeader = viewAfterHeader .getTop () - nextHeaderMargins .bottom - nextHeader .getHeight () - nextHeaderMargins .top ;
187+ int bottomOfThisHeader = recyclerView .getPaddingTop () + stickyHeader .getBottom () + headerMargins .top + headerMargins .bottom ;
198188 if (topOfNextHeader < bottomOfThisHeader ) {
199189 return true ;
200190 }
201191 } else {
202- int leftOfNextHeader = viewAfterHeader .getLeft () - mTempRect1 .right - nextHeader .getWidth () - mTempRect1 .left ;
203- int rightOfThisHeader = recyclerView .getPaddingLeft () + stickyHeader .getRight () + mTempRect2 .left + mTempRect2 .right ;
192+ int leftOfNextHeader = viewAfterHeader .getLeft () - nextHeaderMargins .right - nextHeader .getWidth () - nextHeaderMargins .left ;
193+ int rightOfThisHeader = recyclerView .getPaddingLeft () + stickyHeader .getRight () + headerMargins .left + headerMargins .right ;
204194 if (leftOfNextHeader < rightOfThisHeader ) {
205195 return true ;
206196 }
@@ -214,18 +204,18 @@ private boolean isStickyHeaderBeingPushedOffscreen(RecyclerView recyclerView, Vi
214204 private void translateHeaderWithNextHeader (RecyclerView recyclerView , int orientation , Rect translation ,
215205 View currentHeader , View viewAfterNextHeader , View nextHeader ) {
216206
217- mDimensionCalculator .initMargins ( mTempRect1 , nextHeader );
218- mDimensionCalculator .initMargins ( mTempRect2 , currentHeader );
207+ Rect nextHeaderMargins = mDimensionCalculator .getMargins ( nextHeader );
208+ Rect stickyHeaderMargins = mDimensionCalculator .getMargins ( currentHeader );
219209
220210 if (orientation == LinearLayoutManager .VERTICAL ) {
221- int topOfStickyHeader = getListTop (recyclerView ) + mTempRect2 .top + mTempRect2 .bottom ;
222- int shiftFromNextHeader = viewAfterNextHeader .getTop () - nextHeader .getHeight () - mTempRect1 .bottom - mTempRect1 .top - currentHeader .getHeight () - topOfStickyHeader ;
211+ int topOfStickyHeader = getListTop (recyclerView ) + stickyHeaderMargins .top + stickyHeaderMargins .bottom ;
212+ int shiftFromNextHeader = viewAfterNextHeader .getTop () - nextHeader .getHeight () - nextHeaderMargins .bottom - nextHeaderMargins .top - currentHeader .getHeight () - topOfStickyHeader ;
223213 if (shiftFromNextHeader < topOfStickyHeader ) {
224214 translation .top += shiftFromNextHeader ;
225215 }
226216 } else {
227- int leftOfStickyHeader = getListLeft (recyclerView ) + mTempRect2 .left + mTempRect2 .right ;
228- int shiftFromNextHeader = viewAfterNextHeader .getLeft () - nextHeader .getWidth () - mTempRect1 .right - mTempRect1 .left - currentHeader .getWidth () - leftOfStickyHeader ;
217+ int leftOfStickyHeader = getListLeft (recyclerView ) + stickyHeaderMargins .left + stickyHeaderMargins .right ;
218+ int shiftFromNextHeader = viewAfterNextHeader .getLeft () - nextHeader .getWidth () - nextHeaderMargins .right - nextHeaderMargins .left - currentHeader .getWidth () - leftOfStickyHeader ;
229219 if (shiftFromNextHeader < leftOfStickyHeader ) {
230220 translation .left += shiftFromNextHeader ;
231221 }
@@ -263,7 +253,7 @@ private View getFirstViewUnobscuredByHeader(RecyclerView parent, View firstHeade
263253 */
264254 private boolean itemIsObscuredByHeader (RecyclerView parent , View item , View header , int orientation ) {
265255 RecyclerView .LayoutParams layoutParams = (RecyclerView .LayoutParams ) item .getLayoutParams ();
266- mDimensionCalculator .initMargins ( mTempRect1 , header );
256+ Rect rect = mDimensionCalculator .getMargins ( header );
267257
268258 int adapterPosition = parent .getChildAdapterPosition (item );
269259 if (adapterPosition == RecyclerView .NO_POSITION || mHeaderProvider .getHeader (parent , adapterPosition ) != header ) {
@@ -274,13 +264,13 @@ private boolean itemIsObscuredByHeader(RecyclerView parent, View item, View head
274264
275265 if (orientation == LinearLayoutManager .VERTICAL ) {
276266 int itemTop = item .getTop () - layoutParams .topMargin ;
277- int headerBottom = getListTop (parent ) + header .getBottom () + mTempRect1 .bottom + mTempRect1 .top ;
267+ int headerBottom = getListTop (parent ) + header .getBottom () + rect .bottom + rect .top ;
278268 if (itemTop >= headerBottom ) {
279269 return false ;
280270 }
281271 } else {
282272 int itemLeft = item .getLeft () - layoutParams .leftMargin ;
283- int headerRight = getListLeft (parent ) + header .getRight () + mTempRect1 .right + mTempRect1 .left ;
273+ int headerRight = getListLeft (parent ) + header .getRight () + rect .right + rect .left ;
284274 if (itemLeft >= headerRight ) {
285275 return false ;
286276 }
0 commit comments