Fix multiselect with lazy loading on podcast screen ()

This commit is contained in:
NWuensche 2025-01-31 16:32:36 +00:00 committed by GitHub
parent 22ebef5c41
commit e48af3f094
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -64,6 +64,7 @@ import de.danoeh.antennapod.ui.screen.episode.ItemPagerFragment;
import de.danoeh.antennapod.ui.screen.feed.preferences.FeedSettingsFragment; import de.danoeh.antennapod.ui.screen.feed.preferences.FeedSettingsFragment;
import de.danoeh.antennapod.ui.screen.subscriptions.FeedMenuHandler; import de.danoeh.antennapod.ui.screen.subscriptions.FeedMenuHandler;
import de.danoeh.antennapod.ui.swipeactions.SwipeActions; import de.danoeh.antennapod.ui.swipeactions.SwipeActions;
import io.reactivex.Completable;
import io.reactivex.Maybe; import io.reactivex.Maybe;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
@ -201,14 +202,36 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
Snackbar.LENGTH_SHORT); Snackbar.LENGTH_SHORT);
return false; return false;
} }
new EpisodeMultiSelectActionHandler(getActivity(), menuItem.getItemId()) EpisodeMultiSelectActionHandler handler
.handleAction(adapter.getSelectedItems()); = new EpisodeMultiSelectActionHandler(getActivity(), menuItem.getItemId());
adapter.endSelectMode(); Completable.fromAction(() -> handleActionForAllSelectedItems(handler))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(() -> adapter.endSelectMode(),
error -> Log.e(TAG, Log.getStackTraceString(error)));
return true; return true;
}); });
return viewBinding.getRoot(); return viewBinding.getRoot();
} }
private void handleActionForAllSelectedItems(EpisodeMultiSelectActionHandler handler) {
handler.handleAction(adapter.getSelectedItems());
if (adapter.shouldSelectLazyLoadedItems()) {
int applyPage = page + 1;
List<FeedItem> nextPage;
do {
nextPage = loadMoreData(applyPage);
handler.handleAction(nextPage);
applyPage++;
} while (nextPage.size() == EPISODES_PER_PAGE);
}
}
private List<FeedItem> loadMoreData(int page) {
Feed feed = DBReader.getFeed(feedID, true, (page - 1) * EPISODES_PER_PAGE, EPISODES_PER_PAGE);
return feed != null ? feed.getItems() : Collections.emptyList();
}
private void updateRecyclerPadding() { private void updateRecyclerPadding() {
boolean hasMorePages = feed != null && feed.isPaged() && feed.getNextPageLink() != null; boolean hasMorePages = feed != null && feed.isPaged() && feed.getNextPageLink() != null;
boolean pageLoaderVisible = viewBinding.recyclerView.isScrolledToBottom() && hasMorePages; boolean pageLoaderVisible = viewBinding.recyclerView.isScrolledToBottom() && hasMorePages;
@ -619,20 +642,19 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
isLoadingMore = true; isLoadingMore = true;
adapter.setDummyViews(1); adapter.setDummyViews(1);
adapter.notifyItemInserted(adapter.getItemCount() - 1); adapter.notifyItemInserted(adapter.getItemCount() - 1);
disposable = Observable.fromCallable(() -> DBReader.getFeed(feedID, true, disposable = Observable.fromCallable(() -> loadMoreData(page))
(page - 1) * EPISODES_PER_PAGE, EPISODES_PER_PAGE))
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe( .subscribe(
data -> { items -> {
if (data.getItems().size() < EPISODES_PER_PAGE) { if (items.size() < EPISODES_PER_PAGE) {
hasMoreItems = false; hasMoreItems = false;
} }
feed.getItems().addAll(data.getItems()); feed.getItems().addAll(items);
adapter.setDummyViews(0); adapter.setDummyViews(0);
adapter.updateItems(feed.getItems()); adapter.updateItems(feed.getItems());
if (adapter.shouldSelectLazyLoadedItems()) { if (adapter.shouldSelectLazyLoadedItems()) {
adapter.setSelected(feed.getItems().size() - data.getItems().size(), adapter.setSelected(feed.getItems().size() - items.size(),
feed.getItems().size(), true); feed.getItems().size(), true);
} }
}, error -> { }, error -> {