From 2abe71cc986114000ecdd14aaa17850f60b9549c Mon Sep 17 00:00:00 2001 From: j-haldane Date: Sun, 27 Apr 2025 11:44:02 -0400 Subject: [PATCH] Adapt header handling changes from other recyclerview adapters to fix issue #4475 in StatisticsPlaylistFragment --- .../newpipe/local/BaseLocalListFragment.java | 10 +++-- .../newpipe/local/LocalItemListAdapter.java | 45 +++++++++++-------- .../history/StatisticsPlaylistFragment.java | 6 +-- .../local/playlist/LocalPlaylistFragment.java | 8 ++-- 4 files changed, 40 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java index 53fe1677b..6aa784293 100644 --- a/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java @@ -28,6 +28,8 @@ import static org.schabi.newpipe.ktx.ViewUtils.animate; import static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling; import static org.schabi.newpipe.util.ThemeHelper.getItemViewMode; +import java.util.function.Supplier; + /** * This fragment is design to be used with persistent data such as * {@link org.schabi.newpipe.database.LocalItem}, and does not cache the data contained @@ -100,7 +102,7 @@ public abstract class BaseLocalListFragment extends BaseStateFragment //////////////////////////////////////////////////////////////////////////*/ @Nullable - protected ViewBinding getListHeader() { + protected Supplier getListHeaderSupplier() { return null; } @@ -131,9 +133,9 @@ public abstract class BaseLocalListFragment extends BaseStateFragment itemsList = rootView.findViewById(R.id.items_list); refreshItemViewMode(); - headerRootBinding = getListHeader(); - if (headerRootBinding != null) { - itemListAdapter.setHeader(headerRootBinding.getRoot()); + final Supplier listHeaderSupplier = getListHeaderSupplier(); + if (listHeaderSupplier != null) { + itemListAdapter.setHeaderSupplier(listHeaderSupplier); } footerRootBinding = getListFooter(); itemListAdapter.setFooter(footerRootBinding.getRoot()); diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index b33619dea..3f9cc48ab 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -2,6 +2,7 @@ package org.schabi.newpipe.local; import android.content.Context; import android.util.Log; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -37,6 +38,7 @@ import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; /* * Created by Christian Schabesberger on 01.08.16. @@ -82,13 +84,14 @@ public class LocalItemListAdapter extends RecyclerView.Adapter localItems; private final HistoryRecordManager recordManager; private final DateTimeFormatter dateTimeFormatter; private boolean showFooter = false; - private View header = null; + private Supplier headerSupplier = null; private View footer = null; private ItemViewMode itemViewMode = ItemViewMode.LIST; private boolean useItemHandle = false; @@ -97,6 +100,8 @@ public class LocalItemListAdapter extends RecyclerView.Adapter(); + layoutInflater = LayoutInflater.from(context); + dateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) .withLocale(Localization.getPreferredLocale(context)); } @@ -124,7 +129,7 @@ public class LocalItemListAdapter extends RecyclerView.Adapter offsetStart = " + offsetStart + ", " + "localItems.size() = " + localItems.size() + ", " - + "header = " + header + ", footer = " + footer + ", " + + "header = " + hasHeader() + ", footer = " + footer + ", " + "showFooter = " + showFooter); } notifyItemRangeInserted(offsetStart, data.size()); @@ -144,7 +149,7 @@ public class LocalItemListAdapter extends RecyclerView.Adapter headerSupplier) { + final boolean changed = headerSupplier != this.headerSupplier; + this.headerSupplier = headerSupplier; if (changed) { notifyDataSetChanged(); } @@ -201,6 +206,10 @@ public class LocalItemListAdapter extends RecyclerView.Adapter getItemsList() { @@ -232,7 +241,7 @@ public class LocalItemListAdapter extends RecyclerView.Adapter getListHeaderSupplier() { headerBinding = StatisticPlaylistControlBinding.inflate(activity.getLayoutInflater(), itemsList, false); playlistControlBinding = headerBinding.playlistControl; - return headerBinding; + return headerBinding::getRoot; } @Override diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index f5562549c..5f02a5467 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -29,7 +29,6 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; -import androidx.viewbinding.ViewBinding; import com.evernote.android.state.State; import org.reactivestreams.Subscriber; @@ -67,6 +66,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Supplier; import java.util.stream.Collectors; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; @@ -158,14 +158,14 @@ public class LocalPlaylistFragment extends BaseLocalListFragment getListHeaderSupplier() { headerBinding = LocalPlaylistHeaderBinding.inflate(activity.getLayoutInflater(), itemsList, - false); + false); playlistControlBinding = headerBinding.playlistControl; headerBinding.playlistTitleView.setSelected(true); - return headerBinding; + return headerBinding::getRoot; } @Override