diff options
author | H. Lehmann <ByteHamster@users.noreply.github.com> | 2020-03-17 15:41:24 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-17 15:41:24 +0100 |
commit | 54056dd8d95fe88d1a582c55e066778ce25eff50 (patch) | |
tree | 17eddd45c779ccb01c34e43dab06d0bd046e949d /app/src/main/java/de/danoeh/antennapod/adapter | |
parent | 4e0e4baa056509536f34078bf15031d8c0c97053 (diff) | |
parent | 6066fef1f2a3f3b8d5c5d946c750d356429e75a8 (diff) | |
download | AntennaPod-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.java | 1 | ||||
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java | 67 | ||||
-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.java | 119 | ||||
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/adapter/FeedSearchResultAdapter.java | 76 | ||||
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java | 120 |
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(); - } } |