77import android .graphics .Color ;
88import android .graphics .drawable .ColorDrawable ;
99import android .graphics .drawable .Drawable ;
10- import androidx .annotation .ColorInt ;
11- import androidx .annotation .ColorRes ;
12- import androidx .annotation .IdRes ;
13- import androidx .annotation .LayoutRes ;
14- import androidx .annotation .Nullable ;
15- import androidx .annotation .StringRes ;
16- import androidx .core .content .ContextCompat ;
17- import androidx .recyclerview .widget .ExpandedRecyclerView ;
18- import androidx .recyclerview .widget .LinearLayoutManager ;
19- import androidx .recyclerview .widget .RecyclerView ;
2010import android .util .AttributeSet ;
2111import android .view .LayoutInflater ;
2212import android .view .MotionEvent ;
2313import android .view .View ;
2414import android .view .ViewGroup ;
2515
26- import com .omega_r .libs .omegarecyclerview .expandable_recycler_view .ExpandableStickyHeaderDecoration ;
27- import com .omega_r .libs .omegarecyclerview .expandable_recycler_view .OmegaExpandableRecyclerView ;
2816import com .omega_r .libs .omegarecyclerview .header .HeaderFooterWrapperAdapter ;
2917import com .omega_r .libs .omegarecyclerview .item_decoration .DividerItemDecoration ;
3018import com .omega_r .libs .omegarecyclerview .item_decoration .SpaceItemDecoration ;
3119import com .omega_r .libs .omegarecyclerview .pagination .OnPageRequestListener ;
3220import com .omega_r .libs .omegarecyclerview .pagination .PageRequester ;
3321import com .omega_r .libs .omegarecyclerview .pagination .PaginationAdapter ;
3422import com .omega_r .libs .omegarecyclerview .pagination .WrapperAdapter ;
35- import com .omega_r .libs .omegarecyclerview .sticky_header .BaseStickyHeaderDecoration ;
36- import com .omega_r .libs .omegarecyclerview .sticky_header .StickyHeaderAdapter ;
37- import com .omega_r .libs .omegarecyclerview .sticky_header .StickyHeaderDecoration ;
23+ import com .omega_r .libs .omegarecyclerview .sticky_decoration .BaseStickyDecoration ;
24+ import com .omega_r .libs .omegarecyclerview .sticky_decoration .StickyAdapter ;
25+ import com .omega_r .libs .omegarecyclerview .sticky_decoration .HeaderStickyDecoration ;
26+ import com .omega_r .libs .omegarecyclerview .sticky_decoration .MiddleStickyDecoration ;
3827import com .omega_r .libs .omegarecyclerview .swipe_menu .SwipeMenuHelper ;
3928
4029import java .util .ArrayList ;
4130import java .util .List ;
4231import java .util .WeakHashMap ;
4332
33+ import androidx .annotation .ColorInt ;
34+ import androidx .annotation .ColorRes ;
35+ import androidx .annotation .IdRes ;
36+ import androidx .annotation .LayoutRes ;
37+ import androidx .annotation .NonNull ;
38+ import androidx .annotation .Nullable ;
39+ import androidx .annotation .StringRes ;
40+ import androidx .core .content .ContextCompat ;
41+ import androidx .recyclerview .widget .ExpandedRecyclerView ;
42+ import androidx .recyclerview .widget .LinearLayoutManager ;
43+ import androidx .recyclerview .widget .RecyclerView ;
44+
4445public class OmegaRecyclerView extends ExpandedRecyclerView implements SwipeMenuHelper .Callback {
4546
4647 private static final int [] DEFAULT_DIVIDER_ATTRS = new int []{android .R .attr .listDivider };
@@ -50,7 +51,8 @@ public class OmegaRecyclerView extends ExpandedRecyclerView implements SwipeMenu
5051
5152 private SwipeMenuHelper mSwipeMenuHelper ;
5253 private PageRequester mPageRequester = new PageRequester ();
53- private StickyHeaderDecoration mStickyHeaderDecoration ;
54+ private BaseStickyDecoration mBaseStickyDecoration ;
55+ private int mStickyMode = StickyAdapter .Mode .HEADER ;
5456 @ LayoutRes
5557 private int mPaginationLayout = R .layout .pagination_omega_layout ;
5658 @ LayoutRes
@@ -60,6 +62,7 @@ public class OmegaRecyclerView extends ExpandedRecyclerView implements SwipeMenu
6062 private List <View > mFooterList = new ArrayList <>();
6163 private WeakHashMap <ViewGroup .LayoutParams , SectionState > mLayoutParamCache = new WeakHashMap <>();
6264 private int mItemSpace ;
65+ private int mDividerSize ;
6366
6467 public OmegaRecyclerView (Context context ) {
6568 super (context );
@@ -85,6 +88,7 @@ private void init(Context context, @Nullable AttributeSet attrs, int defStyleAtt
8588 initItemSpace (a );
8689 initEmptyView (a );
8790 initPagination (a );
91+ initStickyMode (a );
8892 a .recycle ();
8993 }
9094 mSwipeMenuHelper = new SwipeMenuHelper (getContext (), this );
@@ -123,14 +127,14 @@ public void initDivider(TypedArray a) {
123127 }
124128 }
125129
126- float dividerHeight = a .getDimension (R .styleable .OmegaRecyclerView_dividerHeight ,
130+ mDividerSize = ( int ) a .getDimension (R .styleable .OmegaRecyclerView_dividerHeight ,
127131 a .getDimension (R .styleable .OmegaRecyclerView_android_dividerHeight , -1 ));
128132 float alpha = a .getFloat (R .styleable .OmegaRecyclerView_alphaDivider , 1 );
129133 int itemSpace = (int ) a .getDimension (R .styleable .OmegaRecyclerView_itemSpace , 0 );
130134
131135 DividerItemDecoration decoration = new DividerItemDecoration (
132136 dividerDrawable ,
133- ( int ) dividerHeight ,
137+ mDividerSize ,
134138 showDivider ,
135139 itemSpace / 2 ,
136140 alpha
@@ -161,14 +165,18 @@ private void initPagination(TypedArray a) {
161165 }
162166 }
163167
168+ private void initStickyMode (TypedArray a ) {
169+ mStickyMode = a .getInt (R .styleable .OmegaRecyclerView_stickyMode , mStickyMode );
170+ }
171+
164172 @ Override
165173 @ SuppressWarnings ("unchecked" )
166174 public void setAdapter (RecyclerView .Adapter adapter ) {
167175 unregisterObservers ();
168176
169177 if (adapter == null ) {
170178 super .setAdapter (null );
171- updateStickyHeader (null );
179+ updateStickyDecoration (null );
172180 return ;
173181 }
174182
@@ -191,7 +199,7 @@ public void setAdapter(RecyclerView.Adapter adapter) {
191199 mPageRequester .reset ();
192200
193201 registerObservers (shellAdapter );
194- updateStickyHeader (shellAdapter );
202+ updateStickyDecoration (shellAdapter );
195203 }
196204
197205 @ Nullable
@@ -227,50 +235,50 @@ private void registerObservers(RecyclerView.Adapter adapter) {
227235 adapter .registerAdapterDataObserver (mEmptyObserver );
228236 }
229237
230- private void updateStickyHeader (@ Nullable RecyclerView .Adapter adapter ) {
238+ protected void updateStickyDecoration (@ Nullable RecyclerView .Adapter adapter ) {
231239 if (adapter == null ) {
232- if (mStickyHeaderDecoration != null ) removeItemDecoration (mStickyHeaderDecoration );
240+ if (mBaseStickyDecoration != null ) removeItemDecoration (mBaseStickyDecoration );
233241 } else {
234- StickyHeaderAdapter stickyHeaderAdapter = null ;
235- OmegaExpandableRecyclerView .Adapter expandableAdapter = null ;
236-
242+ StickyAdapter stickyAdapter = null ;
237243 if (adapter instanceof WrapperAdapter ) {
238244 RecyclerView .Adapter wrappedAdapter = ((WrapperAdapter ) adapter ).getLastWrappedAdapter ();
239- if (wrappedAdapter instanceof StickyHeaderAdapter ) {
240- stickyHeaderAdapter = (StickyHeaderAdapter ) wrappedAdapter ;
245+ if (wrappedAdapter instanceof StickyAdapter ) {
246+ stickyAdapter = (StickyAdapter ) wrappedAdapter ;
241247 }
242248 } else if (adapter instanceof HeaderFooterWrapperAdapter ) {
243- if (((HeaderFooterWrapperAdapter ) adapter ).getStickyHeaderAdapter () != null ) {
244- stickyHeaderAdapter = (StickyHeaderAdapter ) adapter ;
249+ if (((HeaderFooterWrapperAdapter ) adapter ).getStickyAdapter () != null ) {
250+ stickyAdapter = (StickyAdapter ) adapter ;
245251 }
246- } else if (adapter instanceof StickyHeaderAdapter ) {
247- stickyHeaderAdapter = (StickyHeaderAdapter ) adapter ;
252+ } else if (adapter instanceof StickyAdapter ) {
253+ stickyAdapter = (StickyAdapter ) adapter ;
248254 }
249-
250- if (adapter instanceof OmegaExpandableRecyclerView .Adapter ) {
251- expandableAdapter = (OmegaExpandableRecyclerView .Adapter ) adapter ;
252- }
253-
254- if (mStickyHeaderDecoration == null ) {
255- mStickyHeaderDecoration = provideStickyHeaderDecoration (stickyHeaderAdapter , expandableAdapter );
256- if (mStickyHeaderDecoration == null ) return ;
257- mStickyHeaderDecoration .setItemSpace (mItemSpace );
258- addItemDecoration (mStickyHeaderDecoration );
255+ if (mBaseStickyDecoration == null ) {
256+ mBaseStickyDecoration = provideStickyDecoration (adapter , stickyAdapter );
257+ if (mBaseStickyDecoration == null ) return ;
258+ mBaseStickyDecoration .setItemSpace (mItemSpace + mDividerSize );
259+ addItemDecoration (mBaseStickyDecoration );
259260 } else {
260- mStickyHeaderDecoration .setStickyHeaderAdapter (stickyHeaderAdapter );
261- if (mStickyHeaderDecoration instanceof ExpandableStickyHeaderDecoration ) {
262- ((ExpandableStickyHeaderDecoration ) mStickyHeaderDecoration ).setExpandableAdapter (expandableAdapter );
263- }
261+ mBaseStickyDecoration .setStickyAdapter (stickyAdapter );
264262 invalidateItemDecorations ();
265263 }
266264 }
267265 }
268266
269267 @ Nullable
270- protected StickyHeaderDecoration provideStickyHeaderDecoration (@ Nullable StickyHeaderAdapter adapter ,
271- @ Nullable OmegaExpandableRecyclerView .Adapter expandableAdapter ) {
272- if (adapter == null ) return null ;
273- return new BaseStickyHeaderDecoration (adapter );
268+ protected BaseStickyDecoration provideStickyDecoration (@ NonNull RecyclerView .Adapter adapter , @ Nullable StickyAdapter stickyAdapter ) {
269+ if (stickyAdapter == null ) return null ;
270+ switch (mStickyMode ) {
271+ case StickyAdapter .Mode .MIDDLE :
272+ return new MiddleStickyDecoration (stickyAdapter );
273+ case StickyAdapter .Mode .HEADER :
274+ default :
275+ return new HeaderStickyDecoration (stickyAdapter );
276+ }
277+ }
278+
279+ @ Nullable
280+ protected final BaseStickyDecoration getStickyDecoration () {
281+ return mBaseStickyDecoration ;
274282 }
275283
276284
@@ -281,10 +289,10 @@ public void addView(View view, int index, ViewGroup.LayoutParams params) {
281289 } else {
282290 view .setLayoutParams (params );
283291 SectionState sectionState = mLayoutParamCache .get (params );
284- Integer integer = sectionState . position ;
292+ if ( sectionState == null ) return ;
285293 view .setTag (R .id .section_show_divider , sectionState .showDivider );
286294
287- if (integer == 0 ) {
295+ if (sectionState . position == 0 ) {
288296 mHeadersList .add (view );
289297 } else {
290298 mFooterList .add (view );
0 commit comments