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,12 @@ public void setFooter(final View view) {
201203 this .footer = view ;
202204 }
203205
206+ protected boolean hasHeader () {
207+ return this .headerSupplier != null ;
208+ }
209+
210+ @ Deprecated (since = "Calling this method with `true` may cause crashes, see "
211+ + "https://github.com/TeamNewPipe/NewPipe/pull/12996#pullrequestreview-3713317115" )
204212 public void showFooter (final boolean show ) {
205213 if (DEBUG ) {
206214 Log .d (TAG , "showFooter() called with: show = [" + show + "]" );
@@ -211,18 +219,20 @@ public void showFooter(final boolean show) {
211219
212220 showFooter = show ;
213221 if (show ) {
222+ Log .w (TAG , "Calling LocalItemListAdapter.showFooter(true) may cause crashes, see https"
223+ + "://github.com/TeamNewPipe/NewPipe/pull/12996#pullrequestreview-3713317115" );
214224 notifyItemInserted (sizeConsideringHeader ());
215225 } else {
216226 notifyItemRemoved (sizeConsideringHeader ());
217227 }
218228 }
219229
220230 private int adapterOffsetWithoutHeader (final int offset ) {
221- return offset - (header != null ? 1 : 0 );
231+ return offset - (hasHeader () ? 1 : 0 );
222232 }
223233
224234 private int sizeConsideringHeader () {
225- return localItems .size () + (header != null ? 1 : 0 );
235+ return localItems .size () + (hasHeader () ? 1 : 0 );
226236 }
227237
228238 public ArrayList <LocalItem > getItemsList () {
@@ -232,7 +242,7 @@ public ArrayList<LocalItem> getItemsList() {
232242 @ Override
233243 public int getItemCount () {
234244 int count = localItems .size ();
235- if (header != null ) {
245+ if (hasHeader () ) {
236246 count ++;
237247 }
238248 if (footer != null && showFooter ) {
@@ -242,7 +252,7 @@ public int getItemCount() {
242252 if (DEBUG ) {
243253 Log .d (TAG , "getItemCount() called, count = " + count + ", "
244254 + "localItems.size() = " + localItems .size () + ", "
245- + "header = " + header + ", footer = " + footer + ", "
255+ + "header = " + hasHeader () + ", footer = " + footer + ", "
246256 + "showFooter = " + showFooter );
247257 }
248258 return count ;
@@ -255,9 +265,9 @@ public int getItemViewType(int position) {
255265 Log .d (TAG , "getItemViewType() called with: position = [" + position + "]" );
256266 }
257267
258- if (header != null && position == 0 ) {
268+ if (hasHeader () && position == 0 ) {
259269 return HEADER_TYPE ;
260- } else if (header != null ) {
270+ } else if (hasHeader () ) {
261271 position --;
262272 }
263273 if (footer != null && position == localItems .size () && showFooter ) {
@@ -318,7 +328,7 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup paren
318328 }
319329 switch (type ) {
320330 case HEADER_TYPE :
321- return new HeaderFooterHolder (header );
331+ return new HeaderFooterHolder (headerSupplier . get () );
322332 case FOOTER_TYPE :
323333 return new HeaderFooterHolder (footer );
324334 case LOCAL_PLAYLIST_HOLDER_TYPE :
@@ -366,14 +376,14 @@ public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int
366376
367377 if (holder instanceof LocalItemHolder ) {
368378 // If header isn't null, offset the items by -1
369- if (header != null ) {
379+ if (hasHeader () ) {
370380 position --;
371381 }
372382
373383 ((LocalItemHolder ) holder )
374384 .updateFromItem (localItems .get (position ), recordManager , dateTimeFormatter );
375- } else if (holder instanceof HeaderFooterHolder && position == 0 && header != null ) {
376- ((HeaderFooterHolder ) holder ).view = header ;
385+ } else if (holder instanceof HeaderFooterHolder && position == 0 && hasHeader () ) {
386+ ((HeaderFooterHolder ) holder ).view = headerSupplier . get () ;
377387 } else if (holder instanceof HeaderFooterHolder && position == sizeConsideringHeader ()
378388 && footer != null && showFooter ) {
379389 ((HeaderFooterHolder ) holder ).view = footer ;
@@ -387,10 +397,10 @@ public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, fina
387397 for (final Object payload : payloads ) {
388398 if (payload instanceof StreamStateEntity ) {
389399 ((LocalItemHolder ) holder ).updateState (localItems
390- .get (header == null ? position : position - 1 ), recordManager );
400+ .get (hasHeader () ? position - 1 : position ), recordManager );
391401 } else if (payload instanceof Boolean ) {
392402 ((LocalItemHolder ) holder ).updateState (localItems
393- .get (header == null ? position : position - 1 ), recordManager );
403+ .get (hasHeader () ? position - 1 : position ), recordManager );
394404 }
395405 }
396406 } else {
0 commit comments