Using unified item view in search fragment
This commit is contained in:
parent
a80bf2265a
commit
2e6fc7a0a5
@ -6,8 +6,12 @@ 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.
|
||||
@ -21,10 +25,8 @@ public class FeedItemlistAdapter extends BaseAdapter {
|
||||
|
||||
private int currentlyPlayingItem = -1;
|
||||
|
||||
public FeedItemlistAdapter(MainActivity activity,
|
||||
ItemAccess itemAccess,
|
||||
boolean showIcons,
|
||||
boolean makePlayedItemsTransparent) {
|
||||
public FeedItemlistAdapter(MainActivity activity, ItemAccess itemAccess,
|
||||
boolean showIcons, boolean makePlayedItemsTransparent) {
|
||||
super();
|
||||
this.activity = activity;
|
||||
this.itemAccess = itemAccess;
|
||||
@ -44,14 +46,38 @@ public class FeedItemlistAdapter extends BaseAdapter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public FeedItem getItem(int position) {
|
||||
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) {
|
||||
if (convertView == null || !(convertView.getTag() instanceof EpisodeItemViewHolder)) {
|
||||
holder = new EpisodeItemViewHolder(activity, parent);
|
||||
} else {
|
||||
holder = (EpisodeItemViewHolder) convertView.getTag();
|
||||
@ -61,7 +87,6 @@ public class FeedItemlistAdapter extends BaseAdapter {
|
||||
holder.coverHolder.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
final FeedItem item = getItem(position);
|
||||
holder.bind(item);
|
||||
holder.dragHandle.setVisibility(View.GONE);
|
||||
|
||||
@ -69,9 +94,6 @@ public class FeedItemlistAdapter extends BaseAdapter {
|
||||
holder.itemView.setAlpha(1.0f);
|
||||
}
|
||||
|
||||
if (item.getMedia() != null && item.getMedia().isCurrentlyPlaying()) {
|
||||
currentlyPlayingItem = position;
|
||||
}
|
||||
holder.hideSeparatorIfNecessary();
|
||||
return holder.itemView;
|
||||
}
|
||||
@ -91,7 +113,7 @@ public class FeedItemlistAdapter extends BaseAdapter {
|
||||
public interface ItemAccess {
|
||||
int getCount();
|
||||
|
||||
FeedItem getItem(int position);
|
||||
FeedComponent getItem(int position);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,123 +0,0 @@
|
||||
package de.danoeh.antennapod.adapter;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.text.Layout;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.request.RequestOptions;
|
||||
import de.danoeh.antennapod.R;
|
||||
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.core.glide.ApGlideSettings;
|
||||
|
||||
/**
|
||||
* List adapter for search activity.
|
||||
*/
|
||||
public class SearchlistAdapter extends BaseAdapter {
|
||||
|
||||
private final Context context;
|
||||
private final ItemAccess itemAccess;
|
||||
|
||||
|
||||
public SearchlistAdapter(Context context, ItemAccess itemAccess) {
|
||||
this.context = context;
|
||||
this.itemAccess = itemAccess;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return itemAccess.getCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public FeedComponent getItem(int position) {
|
||||
return itemAccess.getItem(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
final Holder holder;
|
||||
FeedComponent component = getItem(position);
|
||||
|
||||
// Inflate Layout
|
||||
if (convertView == null) {
|
||||
holder = new Holder();
|
||||
LayoutInflater inflater = (LayoutInflater) context
|
||||
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
|
||||
convertView = inflater.inflate(R.layout.searchlist_item, parent, false);
|
||||
holder.title = convertView.findViewById(R.id.txtvTitle);
|
||||
if(Build.VERSION.SDK_INT >= 23) {
|
||||
holder.title.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
|
||||
}
|
||||
holder.cover = convertView
|
||||
.findViewById(R.id.imgvFeedimage);
|
||||
holder.subtitle = convertView
|
||||
.findViewById(R.id.txtvSubtitle);
|
||||
|
||||
convertView.setTag(holder);
|
||||
} else {
|
||||
holder = (Holder) convertView.getTag();
|
||||
}
|
||||
if (component.getClass() == Feed.class) {
|
||||
final Feed feed = (Feed) component;
|
||||
holder.title.setText(feed.getTitle());
|
||||
holder.subtitle.setVisibility(View.GONE);
|
||||
|
||||
Glide.with(context)
|
||||
.load(feed.getImageLocation())
|
||||
.apply(new RequestOptions()
|
||||
.placeholder(R.color.light_gray)
|
||||
.error(R.color.light_gray)
|
||||
.diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY)
|
||||
.fitCenter()
|
||||
.dontAnimate())
|
||||
.into(holder.cover);
|
||||
|
||||
} else if (component.getClass() == FeedItem.class) {
|
||||
final FeedItem item = (FeedItem) component;
|
||||
holder.title.setText(item.getTitle());
|
||||
holder.subtitle.setVisibility(View.VISIBLE);
|
||||
|
||||
convertView.setAlpha(item.isPlayed() ? 0.5f : 1.0f);
|
||||
|
||||
Glide.with(context)
|
||||
.load(item.getFeed().getImageLocation())
|
||||
.apply(new RequestOptions()
|
||||
.placeholder(R.color.light_gray)
|
||||
.error(R.color.light_gray)
|
||||
.diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY)
|
||||
.fitCenter()
|
||||
.dontAnimate())
|
||||
.into(holder.cover);
|
||||
|
||||
}
|
||||
|
||||
return convertView;
|
||||
}
|
||||
|
||||
static class Holder {
|
||||
ImageView cover;
|
||||
TextView title;
|
||||
TextView subtitle;
|
||||
}
|
||||
|
||||
public interface ItemAccess {
|
||||
int getCount();
|
||||
|
||||
FeedComponent getItem(int position);
|
||||
}
|
||||
|
||||
}
|
@ -289,7 +289,7 @@ public class FeedItemlistFragment extends ListFragment {
|
||||
AdapterView.AdapterContextMenuInfo adapterInfo = (AdapterView.AdapterContextMenuInfo) menuInfo;
|
||||
|
||||
// because of addHeaderView(), positions are increased by 1!
|
||||
FeedItem item = itemAccess.getItem(adapterInfo.position-1);
|
||||
FeedItem item = (FeedItem) itemAccess.getItem(adapterInfo.position - 1);
|
||||
|
||||
MenuInflater inflater = getActivity().getMenuInflater();
|
||||
inflater.inflate(R.menu.feeditemlist_context, menu);
|
||||
@ -305,11 +305,11 @@ public class FeedItemlistFragment extends ListFragment {
|
||||
@Override
|
||||
public boolean onContextItemSelected(MenuItem item) {
|
||||
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
|
||||
if(menuInfo == null) {
|
||||
if (menuInfo == null) {
|
||||
menuInfo = lastMenuInfo;
|
||||
}
|
||||
// because of addHeaderView(), positions are increased by 1!
|
||||
FeedItem selectedItem = itemAccess.getItem(menuInfo.position-1);
|
||||
FeedItem selectedItem = feed.getItemAtIndex(menuInfo.position - 1);
|
||||
|
||||
if (selectedItem == null) {
|
||||
Log.i(TAG, "Selected item at position " + menuInfo.position + " was null, ignoring selection");
|
||||
|
@ -20,11 +20,12 @@ import androidx.core.view.MenuItemCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
import de.danoeh.antennapod.adapter.SearchlistAdapter;
|
||||
import de.danoeh.antennapod.adapter.FeedItemlistAdapter;
|
||||
import de.danoeh.antennapod.core.event.UnreadItemsUpdateEvent;
|
||||
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.core.storage.DBTasks;
|
||||
import de.danoeh.antennapod.core.storage.FeedSearcher;
|
||||
import de.danoeh.antennapod.view.EmptyViewHandler;
|
||||
import io.reactivex.Observable;
|
||||
@ -33,6 +34,9 @@ import io.reactivex.disposables.Disposable;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.FutureTask;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
|
||||
@ -45,7 +49,7 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL
|
||||
private static final String ARG_QUERY = "query";
|
||||
private static final String ARG_FEED = "feed";
|
||||
|
||||
private SearchlistAdapter searchAdapter;
|
||||
private FeedItemlistAdapter searchAdapter;
|
||||
private List<FeedComponent> searchResults = new ArrayList<>();
|
||||
private Disposable disposable;
|
||||
private ProgressBar progressBar;
|
||||
@ -105,7 +109,7 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL
|
||||
View layout = inflater.inflate(R.layout.search_fragment, container, false);
|
||||
ListView listView = layout.findViewById(R.id.listview);
|
||||
progressBar = layout.findViewById(R.id.progressBar);
|
||||
searchAdapter = new SearchlistAdapter(getActivity(), itemAccess);
|
||||
searchAdapter = new FeedItemlistAdapter((MainActivity) getActivity(), itemAccess, true, true);
|
||||
listView.setAdapter(searchAdapter);
|
||||
listView.setOnItemClickListener(this);
|
||||
|
||||
@ -172,7 +176,7 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL
|
||||
emptyViewHandler.setMessage(getString(R.string.no_results_for_query, query));
|
||||
}
|
||||
|
||||
private final SearchlistAdapter.ItemAccess itemAccess = new SearchlistAdapter.ItemAccess() {
|
||||
private final FeedItemlistAdapter.ItemAccess itemAccess = new FeedItemlistAdapter.ItemAccess() {
|
||||
@Override
|
||||
public int getCount() {
|
||||
return searchResults.size();
|
||||
|
@ -2,34 +2,16 @@ package de.danoeh.antennapod.view.viewholder;
|
||||
|
||||
import android.os.Build;
|
||||
import android.text.Layout;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
import androidx.cardview.widget.CardView;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import com.joanzapata.iconify.Iconify;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
import de.danoeh.antennapod.adapter.CoverLoader;
|
||||
import de.danoeh.antennapod.adapter.QueueRecyclerAdapter;
|
||||
import de.danoeh.antennapod.adapter.actionbutton.ItemActionButton;
|
||||
import de.danoeh.antennapod.core.event.PlaybackPositionEvent;
|
||||
import de.danoeh.antennapod.core.feed.Feed;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.core.feed.MediaType;
|
||||
import de.danoeh.antennapod.core.feed.util.ImageResourceUtils;
|
||||
import de.danoeh.antennapod.core.service.download.DownloadRequest;
|
||||
import de.danoeh.antennapod.core.storage.DownloadRequester;
|
||||
import de.danoeh.antennapod.core.util.Converter;
|
||||
import de.danoeh.antennapod.core.util.DateUtils;
|
||||
import de.danoeh.antennapod.core.util.NetworkUtils;
|
||||
import de.danoeh.antennapod.core.util.ThemeUtils;
|
||||
import de.danoeh.antennapod.view.CircularProgressBar;
|
||||
|
||||
/**
|
||||
* Holds the view which shows feeds.
|
||||
@ -37,14 +19,9 @@ import de.danoeh.antennapod.view.CircularProgressBar;
|
||||
public class FeedViewHolder extends FeedComponentViewHolder {
|
||||
private static final String TAG = "FeedViewHolder";
|
||||
|
||||
private final View container;
|
||||
public final ImageView dragHandle;
|
||||
private final TextView placeholder;
|
||||
private final ImageView cover;
|
||||
private final TextView title;
|
||||
public final View secondaryActionButton;
|
||||
public final ImageView secondaryActionIcon;
|
||||
private final CircularProgressBar secondaryActionProgress;
|
||||
public final CardView coverHolder;
|
||||
|
||||
private final MainActivity activity;
|
||||
@ -53,21 +30,18 @@ public class FeedViewHolder extends FeedComponentViewHolder {
|
||||
public FeedViewHolder(MainActivity activity, ViewGroup parent) {
|
||||
super(LayoutInflater.from(activity).inflate(R.layout.feeditemlist_item, parent, false));
|
||||
this.activity = activity;
|
||||
container = itemView.findViewById(R.id.container);
|
||||
dragHandle = itemView.findViewById(R.id.drag_handle);
|
||||
placeholder = itemView.findViewById(R.id.txtvPlaceholder);
|
||||
cover = itemView.findViewById(R.id.imgvCover);
|
||||
coverHolder = itemView.findViewById(R.id.coverHolder);
|
||||
title = itemView.findViewById(R.id.txtvTitle);
|
||||
if (Build.VERSION.SDK_INT >= 23) {
|
||||
title.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
|
||||
}
|
||||
|
||||
itemView.findViewById(R.id.secondaryActionButton).setVisibility(View.GONE);
|
||||
itemView.findViewById(R.id.status).setVisibility(View.GONE);
|
||||
itemView.findViewById(R.id.progress).setVisibility(View.GONE);
|
||||
secondaryActionProgress = itemView.findViewById(R.id.secondaryActionProgress);
|
||||
secondaryActionButton = itemView.findViewById(R.id.secondaryActionButton);
|
||||
secondaryActionIcon = itemView.findViewById(R.id.secondaryActionIcon);
|
||||
coverHolder = itemView.findViewById(R.id.coverHolder);
|
||||
itemView.findViewById(R.id.drag_handle).setVisibility(View.GONE);
|
||||
itemView.setTag(this);
|
||||
}
|
||||
|
||||
@ -76,11 +50,6 @@ public class FeedViewHolder extends FeedComponentViewHolder {
|
||||
placeholder.setText(feed.getTitle());
|
||||
title.setText(feed.getTitle());
|
||||
|
||||
/*ItemActionButton actionButton = ItemActionButton.forItem(item, true, true);
|
||||
actionButton.configure(secondaryActionButton, secondaryActionIcon, activity);
|
||||
secondaryActionButton.setFocusable(false);
|
||||
secondaryActionProgress.setPercentage(0, null);*/
|
||||
|
||||
if (coverHolder.getVisibility() == View.VISIBLE) {
|
||||
new CoverLoader(activity)
|
||||
.withUri(feed.getImageLocation())
|
||||
|
@ -13,8 +13,5 @@
|
||||
<ListView
|
||||
android:id="@+id/listview"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false"
|
||||
android:paddingLeft="@dimen/list_vertical_padding"
|
||||
android:paddingRight="@dimen/list_vertical_padding" />
|
||||
android:layout_height="match_parent" />
|
||||
</FrameLayout>
|
@ -35,11 +35,12 @@ public class FeedSearcher {
|
||||
final List<FeedComponent> result = new ArrayList<>();
|
||||
try {
|
||||
FutureTask<List<FeedItem>> itemSearchTask = DBTasks.searchFeedItems(context, selectedFeed, query);
|
||||
FutureTask<List<Feed>> feedSearchTask = DBTasks.searchFeeds(context, query);
|
||||
itemSearchTask.run();
|
||||
feedSearchTask.run();
|
||||
|
||||
result.addAll(feedSearchTask.get());
|
||||
if (selectedFeed == 0) {
|
||||
FutureTask<List<Feed>> feedSearchTask = DBTasks.searchFeeds(context, query);
|
||||
feedSearchTask.run();
|
||||
result.addAll(feedSearchTask.get());
|
||||
}
|
||||
result.addAll(itemSearchTask.get());
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
e.printStackTrace();
|
||||
|
Loading…
x
Reference in New Issue
Block a user