@@ -51,12 +51,17 @@ public boolean hasStickyHeader(View itemView, int orientation, int position) {
5151
5252 mDimensionCalculator .initMargins (mTempRect1 , itemView );
5353
54- if (orientation == LinearLayout .VERTICAL ) {
55- offset = itemView .getTop ();
56- margin = mTempRect1 .top ;
54+ if (itemView != null ) {
55+ if (orientation == LinearLayout .VERTICAL ) {
56+ offset = itemView .getTop ();
57+ margin = mTempRect1 .top ;
58+ } else {
59+ offset = itemView .getLeft ();
60+ margin = mTempRect1 .left ;
61+ }
5762 } else {
58- offset = itemView . getLeft () ;
59- margin = mTempRect1 . left ;
63+ offset = - 1 ;
64+ margin = 0 ;
6065 }
6166
6267 return offset <= margin && mAdapter .getHeaderId (position ) >= 0 ;
@@ -113,10 +118,12 @@ private boolean indexOutOfBounds(int position) {
113118 public boolean headerObscuringSomeItem (RecyclerView parent , View firstHeader ) {
114119 for (int i = 0 ; i < parent .getChildCount (); i ++) {
115120 View child = parent .getChildAt (i );
121+
116122 if (itemIsObscuredByHeader (parent , child , firstHeader , mOrientationProvider .getOrientation (parent ))) {
117123 return true ;
118124 }
119125 }
126+
120127 return false ;
121128 }
122129
@@ -128,8 +135,7 @@ public void initHeaderBounds(Rect bounds, RecyclerView recyclerView, View header
128135 View viewAfterNextHeader = getFirstViewUnobscuredByHeader (recyclerView , header );
129136 int firstViewUnderHeaderPosition = recyclerView .getChildAdapterPosition (viewAfterNextHeader );
130137 View secondHeader = mHeaderProvider .getHeader (recyclerView , firstViewUnderHeaderPosition );
131- translateHeaderWithNextHeader (recyclerView , mOrientationProvider .getOrientation (recyclerView ), bounds ,
132- header , viewAfterNextHeader , secondHeader );
138+ translateHeaderWithNextHeader (recyclerView , mOrientationProvider .getOrientation (recyclerView ), bounds , header , viewAfterNextHeader , secondHeader );
133139 }
134140 }
135141
@@ -143,56 +149,61 @@ public Rect getHeaderBounds(RecyclerView recyclerView, View header, View firstVi
143149
144150 private void initDefaultHeaderOffset (Rect headerMargins , RecyclerView recyclerView , View header , View firstView , int orientation , boolean enableStickyHeader ) {
145151 int translationX , translationY ;
152+
146153 mDimensionCalculator .initMargins (mTempRect1 , header );
147154
148- ViewGroup .LayoutParams layoutParams = firstView .getLayoutParams ();
149- int leftMargin = 0 ;
150- int topMargin = 0 ;
151- if (layoutParams instanceof ViewGroup .MarginLayoutParams ) {
152- ViewGroup .MarginLayoutParams marginLayoutParams = (ViewGroup .MarginLayoutParams ) layoutParams ;
153- leftMargin = marginLayoutParams .leftMargin ;
154- topMargin = marginLayoutParams .topMargin ;
155- }
155+ if (header != null && firstView != null ) {
156+ ViewGroup .LayoutParams layoutParams = firstView .getLayoutParams ();
157+ int leftMargin = 0 ;
158+ int topMargin = 0 ;
159+ if (layoutParams instanceof ViewGroup .MarginLayoutParams ) {
160+ ViewGroup .MarginLayoutParams marginLayoutParams = (ViewGroup .MarginLayoutParams ) layoutParams ;
161+ leftMargin = marginLayoutParams .leftMargin ;
162+ topMargin = marginLayoutParams .topMargin ;
163+ }
156164
157- if (orientation == LinearLayoutManager .VERTICAL ) {
158- translationX = firstView .getLeft () - leftMargin + mTempRect1 .left ;
159- translationY = enableStickyHeader ?
160- Math .max (firstView .getTop () - topMargin - header .getHeight () - mTempRect1 .bottom , getListTop (recyclerView ) + mTempRect1 .top ) :
161- firstView .getTop () - topMargin - header .getHeight () - mTempRect1 .bottom ;
162- } else {
163- translationY = firstView .getTop () - topMargin + mTempRect1 .top ;
164- translationX = enableStickyHeader ?
165- Math .max (firstView .getLeft () - leftMargin - header .getWidth () - mTempRect1 .right , getListLeft (recyclerView ) + mTempRect1 .left ) :
166- firstView .getLeft () - leftMargin - header .getWidth () - mTempRect1 .right ;
167- }
165+ if (orientation == LinearLayoutManager .VERTICAL ) {
166+ translationX = firstView .getLeft () - leftMargin + mTempRect1 .left ;
167+ translationY = enableStickyHeader ?
168+ Math .max (firstView .getTop () - topMargin - header .getHeight () - mTempRect1 .bottom , getListTop (recyclerView ) + mTempRect1 .top ) :
169+ firstView .getTop () - topMargin - header .getHeight () - mTempRect1 .bottom ;
170+ } else {
171+ translationY = firstView .getTop () - topMargin + mTempRect1 .top ;
172+ translationX = enableStickyHeader ?
173+ Math .max (firstView .getLeft () - leftMargin - header .getWidth () - mTempRect1 .right , getListLeft (recyclerView ) + mTempRect1 .left ) :
174+ firstView .getLeft () - leftMargin - header .getWidth () - mTempRect1 .right ;
175+ }
168176
169- headerMargins .set (translationX , translationY , translationX + header .getWidth (), translationY + header .getHeight ());
177+ headerMargins .set (translationX , translationY , translationX + header .getWidth (), translationY + header .getHeight ());
178+ }
170179 }
171180
172181 private boolean isStickyHeaderBeingPushedOffscreen (RecyclerView recyclerView , View stickyHeader ) {
173- View viewAfterHeader = getFirstViewUnobscuredByHeader (recyclerView , stickyHeader );
174- int firstViewUnderHeaderPosition = recyclerView .getChildAdapterPosition (viewAfterHeader );
175- if (firstViewUnderHeaderPosition == RecyclerView .NO_POSITION ) {
182+ if (stickyHeader != null ) {
183+ View viewAfterHeader = getFirstViewUnobscuredByHeader (recyclerView , stickyHeader );
184+ int firstViewUnderHeaderPosition = recyclerView .getChildAdapterPosition (viewAfterHeader );
185+ if (firstViewUnderHeaderPosition == RecyclerView .NO_POSITION ) {
176186 return false ;
177- }
178-
179- boolean isReverseLayout = mOrientationProvider .isReverseLayout (recyclerView );
180- if (firstViewUnderHeaderPosition > 0 && hasNewHeader (firstViewUnderHeaderPosition , isReverseLayout )) {
181- View nextHeader = mHeaderProvider .getHeader (recyclerView , firstViewUnderHeaderPosition );
182- mDimensionCalculator .initMargins (mTempRect1 , nextHeader );
183- mDimensionCalculator .initMargins (mTempRect2 , stickyHeader );
187+ }
184188
185- if (mOrientationProvider .getOrientation (recyclerView ) == LinearLayoutManager .VERTICAL ) {
186- int topOfNextHeader = viewAfterHeader .getTop () - mTempRect1 .bottom - nextHeader .getHeight () - mTempRect1 .top ;
187- int bottomOfThisHeader = recyclerView .getPaddingTop () + stickyHeader .getBottom () + mTempRect2 .top + mTempRect2 .bottom ;
188- if (topOfNextHeader < bottomOfThisHeader ) {
189- return true ;
190- }
191- } else {
192- int leftOfNextHeader = viewAfterHeader .getLeft () - mTempRect1 .right - nextHeader .getWidth () - mTempRect1 .left ;
193- int rightOfThisHeader = recyclerView .getPaddingLeft () + stickyHeader .getRight () + mTempRect2 .left + mTempRect2 .right ;
194- if (leftOfNextHeader < rightOfThisHeader ) {
195- return true ;
189+ boolean isReverseLayout = mOrientationProvider .isReverseLayout (recyclerView );
190+ if (firstViewUnderHeaderPosition > 0 && hasNewHeader (firstViewUnderHeaderPosition , isReverseLayout )) {
191+ View nextHeader = mHeaderProvider .getHeader (recyclerView , firstViewUnderHeaderPosition );
192+ mDimensionCalculator .initMargins (mTempRect1 , nextHeader );
193+ mDimensionCalculator .initMargins (mTempRect2 , stickyHeader );
194+
195+ 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 ;
198+ if (topOfNextHeader < bottomOfThisHeader ) {
199+ return true ;
200+ }
201+ } else {
202+ int leftOfNextHeader = viewAfterHeader .getLeft () - mTempRect1 .right - nextHeader .getWidth () - mTempRect1 .left ;
203+ int rightOfThisHeader = recyclerView .getPaddingLeft () + stickyHeader .getRight () + mTempRect2 .left + mTempRect2 .right ;
204+ if (leftOfNextHeader < rightOfThisHeader ) {
205+ return true ;
206+ }
196207 }
197208 }
198209 }
@@ -202,8 +213,10 @@ private boolean isStickyHeaderBeingPushedOffscreen(RecyclerView recyclerView, Vi
202213
203214 private void translateHeaderWithNextHeader (RecyclerView recyclerView , int orientation , Rect translation ,
204215 View currentHeader , View viewAfterNextHeader , View nextHeader ) {
216+
205217 mDimensionCalculator .initMargins (mTempRect1 , nextHeader );
206218 mDimensionCalculator .initMargins (mTempRect2 , currentHeader );
219+
207220 if (orientation == LinearLayoutManager .VERTICAL ) {
208221 int topOfStickyHeader = getListTop (recyclerView ) + mTempRect2 .top + mTempRect2 .bottom ;
209222 int shiftFromNextHeader = viewAfterNextHeader .getTop () - nextHeader .getHeight () - mTempRect1 .bottom - mTempRect1 .top - currentHeader .getHeight () - topOfStickyHeader ;
0 commit comments