3737import java .time .format .FormatStyle ;
3838import java .util .ArrayList ;
3939import java .util .List ;
40+ import java .util .function .Supplier ;
4041
4142/*
4243 * Created by Christian Schabesberger on 01.08.16.
@@ -88,7 +89,7 @@ public class LocalItemListAdapter extends RecyclerView.Adapter<RecyclerView.View
8889 private final DateTimeFormatter dateTimeFormatter ;
8990
9091 private boolean showFooter = false ;
91- private View header = null ;
92+ private Supplier < View > headerSupplier = null ;
9293 private View footer = null ;
9394 private ItemViewMode itemViewMode = ItemViewMode .LIST ;
9495 private boolean useItemHandle = false ;
@@ -97,6 +98,7 @@ public LocalItemListAdapter(final Context context) {
9798 recordManager = new HistoryRecordManager (context );
9899 localItemBuilder = new LocalItemBuilder (context );
99100 localItems = new ArrayList <>();
101+
100102 dateTimeFormatter = DateTimeFormatter .ofLocalizedDate (FormatStyle .SHORT )
101103 .withLocale (Localization .getPreferredLocale (context ));
102104 }
@@ -124,7 +126,7 @@ public void addItems(@Nullable final List<? extends LocalItem> data) {
124126 if (DEBUG ) {
125127 Log .d (TAG , "addItems() after > offsetStart = " + offsetStart + ", "
126128 + "localItems.size() = " + localItems .size () + ", "
127- + "header = " + header + ", footer = " + footer + ", "
129+ + "header = " + hasHeader () + ", footer = " + footer + ", "
128130 + "showFooter = " + showFooter );
129131 }
130132 notifyItemRangeInserted (offsetStart , data .size ());
@@ -144,7 +146,7 @@ public void removeItem(final LocalItem data) {
144146 final int index = localItems .indexOf (data );
145147 if (index != -1 ) {
146148 localItems .remove (index );
147- notifyItemRemoved (index + (header != null ? 1 : 0 ));
149+ notifyItemRemoved (index + (hasHeader () ? 1 : 0 ));
148150 } else {
149151 // this happens when
150152 // 1) removeItem is called on infoItemDuplicate as in showStreamItemDialog of
@@ -189,9 +191,9 @@ public void setUseItemHandle(final boolean useItemHandle) {
189191 this .useItemHandle = useItemHandle ;
190192 }
191193
192- public void setHeader ( final View header ) {
193- final boolean changed = header != this .header ;
194- this .header = header ;
194+ public void setHeaderSupplier ( @ Nullable final Supplier < View > headerSupplier ) {
195+ final boolean changed = headerSupplier != this .headerSupplier ;
196+ this .headerSupplier = headerSupplier ;
195197 if (changed ) {
196198 notifyDataSetChanged ();
197199 }
@@ -201,6 +203,10 @@ public void setFooter(final View view) {
201203 this .footer = view ;
202204 }
203205
206+ protected boolean hasHeader () {
207+ return this .headerSupplier != null ;
208+ }
209+
204210 public void showFooter (final boolean show ) {
205211 if (DEBUG ) {
206212 Log .d (TAG , "showFooter() called with: show = [" + show + "]" );
@@ -218,11 +224,11 @@ public void showFooter(final boolean show) {
218224 }
219225
220226 private int adapterOffsetWithoutHeader (final int offset ) {
221- return offset - (header != null ? 1 : 0 );
227+ return offset - (hasHeader () ? 1 : 0 );
222228 }
223229
224230 private int sizeConsideringHeader () {
225- return localItems .size () + (header != null ? 1 : 0 );
231+ return localItems .size () + (hasHeader () ? 1 : 0 );
226232 }
227233
228234 public ArrayList <LocalItem > getItemsList () {
@@ -232,7 +238,7 @@ public ArrayList<LocalItem> getItemsList() {
232238 @ Override
233239 public int getItemCount () {
234240 int count = localItems .size ();
235- if (header != null ) {
241+ if (hasHeader () ) {
236242 count ++;
237243 }
238244 if (footer != null && showFooter ) {
@@ -242,7 +248,7 @@ public int getItemCount() {
242248 if (DEBUG ) {
243249 Log .d (TAG , "getItemCount() called, count = " + count + ", "
244250 + "localItems.size() = " + localItems .size () + ", "
245- + "header = " + header + ", footer = " + footer + ", "
251+ + "header = " + hasHeader () + ", footer = " + footer + ", "
246252 + "showFooter = " + showFooter );
247253 }
248254 return count ;
@@ -255,9 +261,9 @@ public int getItemViewType(int position) {
255261 Log .d (TAG , "getItemViewType() called with: position = [" + position + "]" );
256262 }
257263
258- if (header != null && position == 0 ) {
264+ if (hasHeader () && position == 0 ) {
259265 return HEADER_TYPE ;
260- } else if (header != null ) {
266+ } else if (hasHeader () ) {
261267 position --;
262268 }
263269 if (footer != null && position == localItems .size () && showFooter ) {
@@ -318,7 +324,7 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup paren
318324 }
319325 switch (type ) {
320326 case HEADER_TYPE :
321- return new HeaderFooterHolder (header );
327+ return new HeaderFooterHolder (headerSupplier . get () );
322328 case FOOTER_TYPE :
323329 return new HeaderFooterHolder (footer );
324330 case LOCAL_PLAYLIST_HOLDER_TYPE :
@@ -366,14 +372,14 @@ public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int
366372
367373 if (holder instanceof LocalItemHolder ) {
368374 // If header isn't null, offset the items by -1
369- if (header != null ) {
375+ if (hasHeader () ) {
370376 position --;
371377 }
372378
373379 ((LocalItemHolder ) holder )
374380 .updateFromItem (localItems .get (position ), recordManager , dateTimeFormatter );
375- } else if (holder instanceof HeaderFooterHolder && position == 0 && header != null ) {
376- ((HeaderFooterHolder ) holder ).view = header ;
381+ } else if (holder instanceof HeaderFooterHolder && position == 0 && hasHeader () ) {
382+ ((HeaderFooterHolder ) holder ).view = headerSupplier . get () ;
377383 } else if (holder instanceof HeaderFooterHolder && position == sizeConsideringHeader ()
378384 && footer != null && showFooter ) {
379385 ((HeaderFooterHolder ) holder ).view = footer ;
@@ -387,10 +393,10 @@ public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, fina
387393 for (final Object payload : payloads ) {
388394 if (payload instanceof StreamStateEntity ) {
389395 ((LocalItemHolder ) holder ).updateState (localItems
390- .get (header == null ? position : position - 1 ), recordManager );
396+ .get (hasHeader () ? position - 1 : position ), recordManager );
391397 } else if (payload instanceof Boolean ) {
392398 ((LocalItemHolder ) holder ).updateState (localItems
393- .get (header == null ? position : position - 1 ), recordManager );
399+ .get (hasHeader () ? position - 1 : position ), recordManager );
394400 }
395401 }
396402 } else {
0 commit comments