summaryrefslogtreecommitdiff
path: root/app/src/main/java/de/danoeh/antennapod/adapter
diff options
context:
space:
mode:
authorH. Lehmann <ByteHamster@users.noreply.github.com>2020-03-17 15:41:24 +0100
committerGitHub <noreply@github.com>2020-03-17 15:41:24 +0100
commit54056dd8d95fe88d1a582c55e066778ce25eff50 (patch)
tree17eddd45c779ccb01c34e43dab06d0bd046e949d /app/src/main/java/de/danoeh/antennapod/adapter
parent4e0e4baa056509536f34078bf15031d8c0c97053 (diff)
parent6066fef1f2a3f3b8d5c5d946c750d356429e75a8 (diff)
downloadAntennaPod-54056dd8d95fe88d1a582c55e066778ce25eff50.zip
Merge pull request #3937 from ByteHamster/recyclerview
Converted lists to RecyclerView
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/adapter')
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java1
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java67
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java (renamed from app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java)42
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java119
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java76
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java120
6 files changed, 105 insertions, 320 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
index 9206cebea..a827c4c04 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
@@ -28,7 +28,6 @@ import de.danoeh.antennapod.core.storage.DownloadRequestException;
import de.danoeh.antennapod.core.storage.DownloadRequester;
import de.danoeh.antennapod.core.util.ThemeUtils;
import de.danoeh.antennapod.view.viewholder.DownloadItemViewHolder;
-import de.danoeh.antennapod.view.viewholder.FeedViewHolder;
/**
* Displays a list of DownloadStatus entries.
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java
deleted file mode 100644
index b34963574..000000000
--- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package de.danoeh.antennapod.adapter;
-
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.core.util.ThemeUtils;
-import de.danoeh.antennapod.view.viewholder.EpisodeItemViewHolder;
-
-/**
- * Shows a list of downloaded episodes.
- */
-public class DownloadedEpisodesListAdapter extends BaseAdapter {
-
- private final MainActivity activity;
- private final ItemAccess itemAccess;
-
- public DownloadedEpisodesListAdapter(MainActivity activity, ItemAccess itemAccess) {
- super();
- this.activity = activity;
- this.itemAccess = itemAccess;
- }
-
- @Override
- public int getCount() {
- return itemAccess.getCount();
- }
-
- @Override
- public FeedItem getItem(int position) {
- return itemAccess.getItem(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- EpisodeItemViewHolder holder;
- if (convertView == null) {
- holder = new EpisodeItemViewHolder(activity, parent);
- } else {
- holder = (EpisodeItemViewHolder) convertView.getTag();
- }
-
- final FeedItem item = getItem(position);
- holder.bind(item);
- holder.dragHandle.setVisibility(View.GONE);
- holder.secondaryActionIcon.setImageResource(ThemeUtils.getDrawableFromAttr(activity, R.attr.ic_delete));
- holder.secondaryActionButton.setOnClickListener(v -> itemAccess.onFeedItemSecondaryAction(item));
- holder.hideSeparatorIfNecessary();
-
- return holder.itemView;
- }
-
- public interface ItemAccess {
- int getCount();
-
- FeedItem getItem(int position);
-
- void onFeedItemSecondaryAction(FeedItem item);
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java
index 71c872de2..f8fd99867 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java
@@ -1,12 +1,12 @@
package de.danoeh.antennapod.adapter;
+import android.app.Activity;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
@@ -24,17 +24,17 @@ import java.util.List;
/**
* List adapter for the list of new episodes.
*/
-public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<EpisodeItemViewHolder>
+public class EpisodeItemListAdapter extends RecyclerView.Adapter<EpisodeItemViewHolder>
implements View.OnCreateContextMenuListener {
private final WeakReference<MainActivity> mainActivityRef;
private List<FeedItem> episodes = new ArrayList<>();
-
private FeedItem selectedItem;
- public AllEpisodesRecycleAdapter(MainActivity mainActivity) {
+ public EpisodeItemListAdapter(MainActivity mainActivity) {
super();
this.mainActivityRef = new WeakReference<>(mainActivity);
+ setHasStableIds(true);
}
public void updateItems(List<FeedItem> items) {
@@ -45,9 +45,7 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<EpisodeItemV
@NonNull
@Override
public EpisodeItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
- EpisodeItemViewHolder viewHolder = new EpisodeItemViewHolder(mainActivityRef.get(), parent);
- viewHolder.dragHandle.setVisibility(View.GONE);
- return viewHolder;
+ return new EpisodeItemViewHolder(mainActivityRef.get(), parent);
}
@Override
@@ -86,6 +84,14 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<EpisodeItemV
return episodes.size();
}
+ protected FeedItem getItem(int index) {
+ return episodes.get(index);
+ }
+
+ protected Activity getActivity() {
+ return mainActivityRef.get();
+ }
+
@Override
public void onCreateContextMenu(final ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
MenuInflater inflater = mainActivityRef.get().getMenuInflater();
@@ -93,26 +99,4 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<EpisodeItemV
menu.setHeaderTitle(selectedItem.getTitle());
FeedItemMenuHandler.onPrepareMenu(menu, selectedItem, R.id.skip_episode_item);
}
-
- /**
- * Notifies a View Holder of relevant callbacks from
- * {@link ItemTouchHelper.Callback}.
- */
- public interface ItemTouchHelperViewHolder {
-
- /**
- * Called when the {@link ItemTouchHelper} first registers an
- * item as being moved or swiped.
- * Implementations should update the item view to indicate
- * it's active state.
- */
- void onItemSelected();
-
-
- /**
- * Called when the {@link ItemTouchHelper} has completed the
- * move or swipe, and the active item state should be cleared.
- */
- void onItemClear();
- }
}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java
deleted file mode 100644
index a5cfcb3e7..000000000
--- a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package de.danoeh.antennapod.adapter;
-
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ListView;
-import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.core.event.PlaybackPositionEvent;
-import de.danoeh.antennapod.core.feed.Feed;
-import de.danoeh.antennapod.core.feed.FeedComponent;
-import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.view.viewholder.EpisodeItemViewHolder;
-import de.danoeh.antennapod.view.viewholder.FeedComponentViewHolder;
-import de.danoeh.antennapod.view.viewholder.FeedViewHolder;
-
-/**
- * List adapter for items of feeds that the user has already subscribed to.
- */
-public class FeedItemlistAdapter extends BaseAdapter {
-
- private final ItemAccess itemAccess;
- private final MainActivity activity;
- private final boolean makePlayedItemsTransparent;
- private final boolean showIcons;
-
- private int currentlyPlayingItem = -1;
-
- public FeedItemlistAdapter(MainActivity activity, ItemAccess itemAccess,
- boolean showIcons, boolean makePlayedItemsTransparent) {
- super();
- this.activity = activity;
- this.itemAccess = itemAccess;
- this.showIcons = showIcons;
- this.makePlayedItemsTransparent = makePlayedItemsTransparent;
- }
-
- @Override
- public int getCount() {
- return itemAccess.getCount();
-
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public FeedComponent getItem(int position) {
- return itemAccess.getItem(position);
- }
-
- @Override
- public View getView(final int position, View convertView, ViewGroup parent) {
- final FeedComponent item = getItem(position);
- if (item instanceof Feed) {
- return getView((Feed) item, convertView, parent);
- } else {
- final FeedItem feeditem = (FeedItem) item;
- if (feeditem.getMedia() != null && feeditem.getMedia().isCurrentlyPlaying()) {
- currentlyPlayingItem = position;
- }
- return getView(feeditem, convertView, parent);
- }
- }
-
- private View getView(Feed item, View convertView, ViewGroup parent) {
- FeedViewHolder holder;
- if (convertView == null || !(convertView.getTag() instanceof FeedViewHolder)) {
- holder = new FeedViewHolder(activity, parent);
- } else {
- holder = (FeedViewHolder) convertView.getTag();
- }
- holder.bind(item);
- return holder.itemView;
- }
-
- private View getView(final FeedItem item, View convertView, ViewGroup parent) {
- EpisodeItemViewHolder holder;
- if (convertView == null || !(convertView.getTag() instanceof EpisodeItemViewHolder)) {
- holder = new EpisodeItemViewHolder(activity, parent);
- } else {
- holder = (EpisodeItemViewHolder) convertView.getTag();
- }
-
- if (!showIcons) {
- holder.coverHolder.setVisibility(View.GONE);
- }
-
- holder.bind(item);
- holder.dragHandle.setVisibility(View.GONE);
-
- if (!makePlayedItemsTransparent) {
- holder.itemView.setAlpha(1.0f);
- }
-
- holder.hideSeparatorIfNecessary();
- return holder.itemView;
- }
-
- public void notifyCurrentlyPlayingItemChanged(PlaybackPositionEvent event, ListView listView) {
- if (currentlyPlayingItem != -1 && currentlyPlayingItem < getCount()) {
- View view = listView.getChildAt(currentlyPlayingItem
- - listView.getFirstVisiblePosition() + listView.getHeaderViewsCount());
- if (view == null) {
- return;
- }
- EpisodeItemViewHolder holder = (EpisodeItemViewHolder) view.getTag();
- holder.notifyPlaybackPositionUpdated(event);
- }
- }
-
- public interface ItemAccess {
- int getCount();
-
- FeedComponent getItem(int position);
- }
-
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java
new file mode 100644
index 000000000..2e5ba31c9
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java
@@ -0,0 +1,76 @@
+package de.danoeh.antennapod.adapter;
+
+import android.view.View;
+import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.RequestOptions;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.activity.MainActivity;
+import de.danoeh.antennapod.core.feed.Feed;
+import de.danoeh.antennapod.fragment.FeedItemlistFragment;
+import de.danoeh.antennapod.view.SquareImageView;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+
+public class FeedSearchResultAdapter extends RecyclerView.Adapter<FeedSearchResultAdapter.Holder> {
+
+ private final WeakReference<MainActivity> mainActivityRef;
+ private final List<Feed> data = new ArrayList<>();
+
+ public FeedSearchResultAdapter(MainActivity mainActivity) {
+ this.mainActivityRef = new WeakReference<>(mainActivity);
+ }
+
+ public void updateData(List<Feed> newData) {
+ data.clear();
+ data.addAll(newData);
+ notifyDataSetChanged();
+ }
+
+ @NonNull
+ @Override
+ public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View convertView = View.inflate(mainActivityRef.get(), R.layout.searchlist_item_feed, null);
+ return new Holder(convertView);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull Holder holder, int position) {
+ final Feed podcast = data.get(position);
+ holder.imageView.setContentDescription(podcast.getTitle());
+ holder.imageView.setOnClickListener(v ->
+ mainActivityRef.get().loadChildFragment(FeedItemlistFragment.newInstance(podcast.getId())));
+
+ Glide.with(mainActivityRef.get())
+ .load(podcast.getImageUrl())
+ .apply(new RequestOptions()
+ .placeholder(R.color.light_gray)
+ .fitCenter()
+ .dontAnimate())
+ .into(holder.imageView);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return data.get(position).getId();
+ }
+
+ @Override
+ public int getItemCount() {
+ return data.size();
+ }
+
+ static class Holder extends RecyclerView.ViewHolder {
+ SquareImageView imageView;
+
+ public Holder(@NonNull View itemView) {
+ super(itemView);
+ imageView = itemView.findViewById(R.id.discovery_cover);
+ imageView.setDirection(SquareImageView.DIRECTION_HEIGHT);
+ }
+ }
+}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java
index 456f45fd2..14f537eb0 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java
@@ -6,44 +6,24 @@ import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MotionEvent;
import android.view.View;
-import android.view.ViewGroup;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.core.view.MotionEventCompat;
import androidx.recyclerview.widget.ItemTouchHelper;
-import androidx.recyclerview.widget.RecyclerView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.preferences.UserPreferences;
-import de.danoeh.antennapod.core.util.LongList;
-import de.danoeh.antennapod.fragment.ItemPagerFragment;
-import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler;
import de.danoeh.antennapod.view.viewholder.EpisodeItemViewHolder;
-import org.apache.commons.lang3.ArrayUtils;
-
-import java.lang.ref.WeakReference;
/**
* List adapter for the queue.
*/
-public class QueueRecyclerAdapter extends RecyclerView.Adapter<EpisodeItemViewHolder> implements View.OnCreateContextMenuListener {
+public class QueueRecyclerAdapter extends EpisodeItemListAdapter {
private static final String TAG = "QueueRecyclerAdapter";
- private final WeakReference<MainActivity> mainActivity;
- private final ItemAccess itemAccess;
private final ItemTouchHelper itemTouchHelper;
-
private boolean locked;
- private FeedItem selectedItem;
-
- public QueueRecyclerAdapter(MainActivity mainActivity,
- ItemAccess itemAccess,
- ItemTouchHelper itemTouchHelper) {
- super();
- this.mainActivity = new WeakReference<>(mainActivity);
- this.itemAccess = itemAccess;
+ public QueueRecyclerAdapter(MainActivity mainActivity, ItemTouchHelper itemTouchHelper) {
+ super(mainActivity);
this.itemTouchHelper = itemTouchHelper;
locked = UserPreferences.isQueueLocked();
}
@@ -53,31 +33,10 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<EpisodeItemViewHo
notifyDataSetChanged();
}
- @NonNull
- @Override
- public EpisodeItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
- return new EpisodeItemViewHolder(mainActivity.get(), parent);
- }
-
@Override
@SuppressLint("ClickableViewAccessibility")
public void onBindViewHolder(EpisodeItemViewHolder holder, int pos) {
- FeedItem item = itemAccess.getItem(pos);
- holder.bind(item);
- holder.dragHandle.setVisibility(locked ? View.GONE : View.VISIBLE);
- holder.itemView.setOnLongClickListener(v -> {
- selectedItem = item;
- return false;
- });
- holder.itemView.setOnClickListener(v -> {
- MainActivity activity = mainActivity.get();
- if (activity != null) {
- long[] ids = itemAccess.getQueueIds().toArray();
- int position = ArrayUtils.indexOf(ids, item.getId());
- activity.loadChildFragment(ItemPagerFragment.newInstance(ids, position));
- }
- });
-
+ super.onBindViewHolder(holder, pos);
View.OnTouchListener startDragTouchListener = (v1, event) -> {
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
Log.d(TAG, "startDrag()");
@@ -85,80 +44,33 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<EpisodeItemViewHo
}
return false;
};
- if (!locked) {
- holder.dragHandle.setOnTouchListener(startDragTouchListener);
- holder.coverHolder.setOnTouchListener(startDragTouchListener);
- } else {
+
+ if (locked) {
+ holder.dragHandle.setVisibility(View.GONE);
holder.dragHandle.setOnTouchListener(null);
holder.coverHolder.setOnTouchListener(null);
+ } else {
+ holder.dragHandle.setVisibility(View.VISIBLE);
+ holder.dragHandle.setOnTouchListener(startDragTouchListener);
+ holder.coverHolder.setOnTouchListener(startDragTouchListener);
}
- holder.itemView.setOnCreateContextMenuListener(this);
holder.isInQueue.setVisibility(View.GONE);
holder.hideSeparatorIfNecessary();
}
- @Nullable
- public FeedItem getSelectedItem() {
- return selectedItem;
- }
-
- @Override
- public long getItemId(int position) {
- FeedItem item = itemAccess.getItem(position);
- return item != null ? item.getId() : RecyclerView.NO_POSITION;
- }
-
- public int getItemCount() {
- return itemAccess.getCount();
- }
-
@Override
public void onCreateContextMenu(final ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
- MenuInflater inflater = mainActivity.get().getMenuInflater();
- inflater.inflate(R.menu.queue_context, menu); // queue-specific menu items
- inflater.inflate(R.menu.feeditemlist_context, menu); // generic menu items for item feeds
+ MenuInflater inflater = getActivity().getMenuInflater();
+ inflater.inflate(R.menu.queue_context, menu);
+ super.onCreateContextMenu(menu, v, menuInfo);
- menu.setHeaderTitle(selectedItem.getTitle());
- FeedItemMenuHandler.onPrepareMenu(menu, selectedItem, R.id.skip_episode_item);
- // Queue-specific menu preparation
final boolean keepSorted = UserPreferences.isQueueKeepSorted();
- final LongList queueAccess = itemAccess.getQueueIds();
- if (queueAccess.size() == 0 || queueAccess.get(0) == selectedItem.getId() || keepSorted) {
+ if (getItem(0).getId() == getSelectedItem().getId() || keepSorted) {
menu.findItem(R.id.move_to_top_item).setVisible(false);
}
- if (queueAccess.size() == 0 || queueAccess.get(queueAccess.size() - 1) == selectedItem.getId() || keepSorted) {
+ if (getItem(getItemCount() - 1).getId() == getSelectedItem().getId() || keepSorted) {
menu.findItem(R.id.move_to_bottom_item).setVisible(false);
}
}
-
- public interface ItemAccess {
- FeedItem getItem(int position);
-
- int getCount();
-
- LongList getQueueIds();
- }
-
- /**
- * Notifies a View Holder of relevant callbacks from
- * {@link ItemTouchHelper.Callback}.
- */
- public interface ItemTouchHelperViewHolder {
-
- /**
- * Called when the {@link ItemTouchHelper} first registers an
- * item as being moved or swiped.
- * Implementations should update the item view to indicate
- * it's active state.
- */
- void onItemSelected();
-
-
- /**
- * Called when the {@link ItemTouchHelper} has completed the
- * move or swipe, and the active item state should be cleared.
- */
- void onItemClear();
- }
}