22
33import android .content .Context ;
44import android .util .Log ;
5+ import android .view .LayoutInflater ;
56import android .view .View ;
67import android .view .ViewGroup ;
78
3738import java .time .format .FormatStyle ;
3839import java .util .ArrayList ;
3940import java .util .List ;
41+ import java .util .function .Supplier ;
4042
4143/*
4244 * Created by Christian Schabesberger on 01.08.16.
@@ -82,13 +84,14 @@ public class LocalItemListAdapter extends RecyclerView.Adapter<RecyclerView.View
8284 private static final int REMOTE_PLAYLIST_CARD_HOLDER_TYPE = 0x3002 ;
8385 private static final int REMOTE_BOOKMARK_PLAYLIST_HOLDER_TYPE = 0x3003 ;
8486
87+ private final LayoutInflater layoutInflater ;
8588 private final LocalItemBuilder localItemBuilder ;
8689 private final ArrayList <LocalItem > localItems ;
8790 private final HistoryRecordManager recordManager ;
8891 private final DateTimeFormatter dateTimeFormatter ;
8992
9093 private boolean showFooter = false ;
91- private View header = null ;
94+ private Supplier < View > headerSupplier = null ;
9295 private View footer = null ;
9396 private ItemViewMode itemViewMode = ItemViewMode .LIST ;
9497 private boolean useItemHandle = false ;
@@ -97,6 +100,8 @@ public LocalItemListAdapter(final Context context) {
97100 recordManager = new HistoryRecordManager (context );
98101 localItemBuilder = new LocalItemBuilder (context );
99102 localItems = new ArrayList <>();
103+ layoutInflater = LayoutInflater .from (context );
104+
100105 dateTimeFormatter = DateTimeFormatter .ofLocalizedDate (FormatStyle .SHORT )
101106 .withLocale (Localization .getPreferredLocale (context ));
102107 }
@@ -124,7 +129,7 @@ public void addItems(@Nullable final List<? extends LocalItem> data) {
124129 if (DEBUG ) {
125130 Log .d (TAG , "addItems() after > offsetStart = " + offsetStart + ", "
126131 + "localItems.size() = " + localItems .size () + ", "
127- + "header = " + header + ", footer = " + footer + ", "
132+ + "header = " + hasHeader () + ", footer = " + footer + ", "
128133 + "showFooter = " + showFooter );
129134 }
130135 notifyItemRangeInserted (offsetStart , data .size ());
@@ -144,7 +149,7 @@ public void removeItem(final LocalItem data) {
144149 final int index = localItems .indexOf (data );
145150 if (index != -1 ) {
146151 localItems .remove (index );
147- notifyItemRemoved (index + (header != null ? 1 : 0 ));
152+ notifyItemRemoved (index + (hasHeader () ? 1 : 0 ));
148153 } else {
149154 // this happens when
150155 // 1) removeItem is called on infoItemDuplicate as in showStreamItemDialog of
@@ -189,9 +194,9 @@ public void setUseItemHandle(final boolean useItemHandle) {
189194 this .useItemHandle = useItemHandle ;
190195 }
191196
192- public void setHeader ( final View header ) {
193- final boolean changed = header != this .header ;
194- this .header = header ;
197+ public void setHeaderSupplier ( @ Nullable final Supplier < View > headerSupplier ) {
198+ final boolean changed = headerSupplier != this .headerSupplier ;
199+ this .headerSupplier = headerSupplier ;
195200 if (changed ) {
196201 notifyDataSetChanged ();
197202 }
@@ -201,6 +206,10 @@ public void setFooter(final View view) {
201206 this .footer = view ;
202207 }
203208
209+ protected boolean hasHeader () {
210+ return this .headerSupplier != null ;
211+ }
212+
204213 public void showFooter (final boolean show ) {
205214 if (DEBUG ) {
206215 Log .d (TAG , "showFooter() called with: show = [" + show + "]" );
@@ -218,11 +227,11 @@ public void showFooter(final boolean show) {
218227 }
219228
220229 private int adapterOffsetWithoutHeader (final int offset ) {
221- return offset - (header != null ? 1 : 0 );
230+ return offset - (hasHeader () ? 1 : 0 );
222231 }
223232
224233 private int sizeConsideringHeader () {
225- return localItems .size () + (header != null ? 1 : 0 );
234+ return localItems .size () + (hasHeader () ? 1 : 0 );
226235 }
227236
228237 public ArrayList <LocalItem > getItemsList () {
@@ -232,7 +241,7 @@ public ArrayList<LocalItem> getItemsList() {
232241 @ Override
233242 public int getItemCount () {
234243 int count = localItems .size ();
235- if (header != null ) {
244+ if (hasHeader () ) {
236245 count ++;
237246 }
238247 if (footer != null && showFooter ) {
@@ -242,7 +251,7 @@ public int getItemCount() {
242251 if (DEBUG ) {
243252 Log .d (TAG , "getItemCount() called, count = " + count + ", "
244253 + "localItems.size() = " + localItems .size () + ", "
245- + "header = " + header + ", footer = " + footer + ", "
254+ + "header = " + hasHeader () + ", footer = " + footer + ", "
246255 + "showFooter = " + showFooter );
247256 }
248257 return count ;
@@ -255,9 +264,9 @@ public int getItemViewType(int position) {
255264 Log .d (TAG , "getItemViewType() called with: position = [" + position + "]" );
256265 }
257266
258- if (header != null && position == 0 ) {
267+ if (hasHeader () && position == 0 ) {
259268 return HEADER_TYPE ;
260- } else if (header != null ) {
269+ } else if (hasHeader () ) {
261270 position --;
262271 }
263272 if (footer != null && position == localItems .size () && showFooter ) {
@@ -318,7 +327,7 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup paren
318327 }
319328 switch (type ) {
320329 case HEADER_TYPE :
321- return new HeaderFooterHolder (header );
330+ return new HeaderFooterHolder (headerSupplier . get () );
322331 case FOOTER_TYPE :
323332 return new HeaderFooterHolder (footer );
324333 case LOCAL_PLAYLIST_HOLDER_TYPE :
@@ -366,14 +375,14 @@ public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int
366375
367376 if (holder instanceof LocalItemHolder ) {
368377 // If header isn't null, offset the items by -1
369- if (header != null ) {
378+ if (hasHeader () ) {
370379 position --;
371380 }
372381
373382 ((LocalItemHolder ) holder )
374383 .updateFromItem (localItems .get (position ), recordManager , dateTimeFormatter );
375- } else if (holder instanceof HeaderFooterHolder && position == 0 && header != null ) {
376- ((HeaderFooterHolder ) holder ).view = header ;
384+ } else if (holder instanceof HeaderFooterHolder && position == 0 && hasHeader () ) {
385+ ((HeaderFooterHolder ) holder ).view = headerSupplier . get () ;
377386 } else if (holder instanceof HeaderFooterHolder && position == sizeConsideringHeader ()
378387 && footer != null && showFooter ) {
379388 ((HeaderFooterHolder ) holder ).view = footer ;
@@ -387,10 +396,10 @@ public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, fina
387396 for (final Object payload : payloads ) {
388397 if (payload instanceof StreamStateEntity ) {
389398 ((LocalItemHolder ) holder ).updateState (localItems
390- .get (header == null ? position : position - 1 ), recordManager );
399+ .get (hasHeader () ? position - 1 : position ), recordManager );
391400 } else if (payload instanceof Boolean ) {
392401 ((LocalItemHolder ) holder ).updateState (localItems
393- .get (header == null ? position : position - 1 ), recordManager );
402+ .get (hasHeader () ? position - 1 : position ), recordManager );
394403 }
395404 }
396405 } else {
0 commit comments