Skip to content

Commit 72c1d84

Browse files
Merge pull request #130 from Omega-R/feature/new_mode_sticky_header
Feature/new mode sticky header
2 parents 38406fd + e134f44 commit 72c1d84

File tree

19 files changed

+531
-356
lines changed

19 files changed

+531
-356
lines changed

app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/support_sticky/DefaultStickyAdapter.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77

88
import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
99
import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.OmegaExpandableRecyclerView;
10-
import com.omega_r.libs.omegarecyclerview.sticky_header.StickyHeaderAdapter;
11-
import com.omega_r.libs.omegarecyclerview.sticky_header.BaseStickyHeaderDecoration;
10+
import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data.ExpandableViewData;
11+
import com.omega_r.libs.omegarecyclerview.sticky_decoration.StickyAdapter;
12+
import com.omega_r.libs.omegarecyclerview.sticky_decoration.HeaderStickyDecoration;
1213
import com.omega_r.omegarecyclerview.R;
1314
import com.omega_r.omegarecyclerview.expandable_example.core.QuoteGlobalInfo;
1415

15-
public class DefaultStickyAdapter extends OmegaExpandableRecyclerView.Adapter<QuoteGlobalInfo, String> implements StickyHeaderAdapter<DefaultStickyAdapter.StickyViewHolder> {
16+
public class DefaultStickyAdapter extends OmegaExpandableRecyclerView.Adapter<QuoteGlobalInfo, String> implements StickyAdapter<DefaultStickyAdapter.StickyViewHolder> {
1617

1718
@Override
1819
protected ExGroupViewHolder provideGroupViewHolder(@NonNull ViewGroup viewGroup) {
@@ -25,18 +26,20 @@ protected ExChildViewHolder provideChildViewHolder(@NonNull ViewGroup viewGroup)
2526
}
2627

2728
@Override
28-
public long getHeaderId(int position) {
29-
Integer providedId = getItem(position).getStickyId();
30-
return providedId == null ? BaseStickyHeaderDecoration.NO_HEADER_ID : providedId;
29+
public long getStickyId(int position) {
30+
ExpandableViewData<QuoteGlobalInfo, String> item = getItem(position);
31+
if (item == null) return HeaderStickyDecoration.NO_STICKY_ID;
32+
Integer providedId = item.getStickyId();
33+
return providedId == null ? HeaderStickyDecoration.NO_STICKY_ID : providedId;
3134
}
3235

3336
@Override
34-
public StickyViewHolder onCreateHeaderViewHolder(ViewGroup parent) {
37+
public StickyViewHolder onCreateStickyViewHolder(ViewGroup parent) {
3538
return new StickyViewHolder(parent);
3639
}
3740

3841
@Override
39-
public void onBindHeaderViewHolder(StickyViewHolder viewHolder, int position) {
42+
public void onBindStickyViewHolder(StickyViewHolder viewHolder, int position) {
4043
viewHolder.bind(getItem(position).getGroup().getYear());
4144
}
4245

app/src/main/java/com/omega_r/omegarecyclerview/sticky_header_example/StickyHeaderAdapter.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77
import android.widget.TextView;
88

99
import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
10+
import com.omega_r.libs.omegarecyclerview.sticky_decoration.StickyAdapter;
1011
import com.omega_r.omegarecyclerview.R;
1112

1213
public class StickyHeaderAdapter extends OmegaRecyclerView.Adapter<StickyHeaderAdapter.ViewHolder>
13-
implements com.omega_r.libs.omegarecyclerview.sticky_header.StickyHeaderAdapter<StickyHeaderAdapter.HeaderHolder> {
14+
implements StickyAdapter<StickyHeaderAdapter.HeaderHolder> {
1415

1516
private LayoutInflater mInflater;
1617

@@ -35,19 +36,19 @@ public int getItemCount() {
3536
}
3637

3738
@Override
38-
public long getHeaderId(int position) {
39+
public long getStickyId(int position) {
3940
return (long) position / 6;
4041
}
4142

4243
@Override
43-
public HeaderHolder onCreateHeaderViewHolder(ViewGroup parent) {
44+
public HeaderHolder onCreateStickyViewHolder(ViewGroup parent) {
4445
View view = mInflater.inflate(R.layout.sticky_header_test, parent, false);
4546
return new HeaderHolder(view);
4647
}
4748

4849
@Override
49-
public void onBindHeaderViewHolder(HeaderHolder viewHolder, int position) {
50-
viewHolder.header.setText("Header " + getHeaderId(position));
50+
public void onBindStickyViewHolder(HeaderHolder viewHolder, int position) {
51+
viewHolder.header.setText("Header " + getStickyId(position));
5152
}
5253

5354
static class ViewHolder extends OmegaRecyclerView.ViewHolder {

app/src/main/res/layout/sticky_header_test.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<TextView
33
xmlns:android="http://schemas.android.com/apk/res/android"
44
xmlns:tools="http://schemas.android.com/tools"
5-
android:layout_width="match_parent"
5+
android:layout_width="150dp"
66
android:layout_height="50dp"
77
android:background="@android:color/black"
88
android:gravity="center_vertical"

omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/OmegaRecyclerView.java

Lines changed: 59 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,40 +7,41 @@
77
import android.graphics.Color;
88
import android.graphics.drawable.ColorDrawable;
99
import 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;
2010
import android.util.AttributeSet;
2111
import android.view.LayoutInflater;
2212
import android.view.MotionEvent;
2313
import android.view.View;
2414
import 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;
2816
import com.omega_r.libs.omegarecyclerview.header.HeaderFooterWrapperAdapter;
2917
import com.omega_r.libs.omegarecyclerview.item_decoration.DividerItemDecoration;
3018
import com.omega_r.libs.omegarecyclerview.item_decoration.SpaceItemDecoration;
3119
import com.omega_r.libs.omegarecyclerview.pagination.OnPageRequestListener;
3220
import com.omega_r.libs.omegarecyclerview.pagination.PageRequester;
3321
import com.omega_r.libs.omegarecyclerview.pagination.PaginationAdapter;
3422
import 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;
3827
import com.omega_r.libs.omegarecyclerview.swipe_menu.SwipeMenuHelper;
3928

4029
import java.util.ArrayList;
4130
import java.util.List;
4231
import 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+
4445
public 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

Comments
 (0)