package fr.tvbarthel.cheerleader.sampleapp.adapter; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import com.netcosports.recyclergesture.library.swipe.SwipeToDismissGesture; import java.util.List; import fr.tvbarthel.cheerleader.library.client.SoundCloudTrack; import fr.tvbarthel.cheerleader.library.player.CheerleaderPlayerListener; import fr.tvbarthel.cheerleader.sampleapp.R; import fr.tvbarthel.cheerleader.sampleapp.ui.TrackView; /** * Simple adapter used to display artist tracks in a list with an optional header. */ public class TracksAdapter extends RecyclerView.Adapter<TracksAdapter.Holder> implements CheerleaderPlayerListener, SwipeToDismissGesture.Dismisser { /** * View types. */ private static final int VIEW_TYPE_TRACK = 1; private static final int VIEW_TYPE_HEADER = 2; /** * Current played track playlist position used to display an indicator. */ private int mPlayedTrackPosition; /** * Adapted tracks. */ private List<SoundCloudTrack> mTracks; /** * view header */ private View mHeaderView; /** * listener used to catch event on the raw view. */ private TrackView.Listener mListener; /** * Listener used to catch event performed on the list. */ private Listener mAdapterListener; /** * Simple adapter used to display tracks in a list. * * @param listener listener used to catch event on the raw view. * @param tracks tracks. */ public TracksAdapter(TrackView.Listener listener, List<SoundCloudTrack> tracks) { super(); mTracks = tracks; mPlayedTrackPosition = -1; mListener = listener; } @Override public Holder onCreateViewHolder(ViewGroup viewGroup, int i) { Holder holder; switch (i) { case VIEW_TYPE_TRACK: TrackView v = new TrackView(viewGroup.getContext()); v.setListener(mListener); v.setLayoutParams( new RecyclerView.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT ) ); holder = new TrackHolder(v); break; case VIEW_TYPE_HEADER: holder = new HeaderHolder(mHeaderView); break; default: throw new IllegalStateException("View type not handled : " + i); } return holder; } @Override public void onBindViewHolder(Holder holder, int i) { switch (holder.viewType) { case VIEW_TYPE_TRACK: int offset = mHeaderView != null ? 1 : 0; ((TrackHolder) holder).trackView.setModel(mTracks.get(i - offset)); if (i == mPlayedTrackPosition) { ((TrackHolder) holder).trackView .setBackgroundResource(R.drawable.selectable_background_red_light); ((TrackHolder) holder).trackView.setSelected(true); } else { ((TrackHolder) holder).trackView .setBackgroundResource(R.drawable.selectable_background_white); ((TrackHolder) holder).trackView.setSelected(false); } break; case VIEW_TYPE_HEADER: // do nothing break; default: throw new IllegalStateException("Unhandled view type : " + holder.viewType); } } @Override public int getItemCount() { int header = mHeaderView == null ? 0 : 1; return header + mTracks.size(); } @Override public int getItemViewType(int position) { if (position == 0 && mHeaderView != null) { return VIEW_TYPE_HEADER; } else { return VIEW_TYPE_TRACK; } } //////////////////////////////////////////////////////////// ///// Player listener used to keep played track updated //// //////////////////////////////////////////////////////////// @Override public void onPlayerPlay(SoundCloudTrack track, int position) { int offset = mHeaderView == null ? 0 : 1; mPlayedTrackPosition = position + offset; notifyDataSetChanged(); } @Override public void onPlayerPause() { } @Override public void onPlayerSeekTo(int milli) { } @Override public void onPlayerDestroyed() { } @Override public void onBufferingStarted() { } @Override public void onBufferingEnded() { } @Override public void onProgressChanged(int milli) { } //////////////////////////////////////////////////////////// //////////////////////// Dismisser ///////////////////////// //////////////////////////////////////////////////////////// @Override public void dismiss(int i) { if (mAdapterListener != null) { if (mHeaderView != null) { i--; } mTracks.remove(i); mAdapterListener.onTrackDismissed(i); } } /** * Set the header view. * * @param v header view. */ public void setHeaderView(View v) { mHeaderView = v; } /** * Set a listener used to catch events performed on the list. * * @param listener listener which will be notified of events performed on the list. */ public void setAdapterListener(Listener listener) { mAdapterListener = listener; } /** * View holder pattern. */ public static abstract class Holder extends RecyclerView.ViewHolder { private int viewType; public Holder(View v, int viewType) { super(v); this.viewType = viewType; } } /** * View holder for a track view. */ public static class TrackHolder extends Holder { private TrackView trackView; public TrackHolder(TrackView v) { super(v, VIEW_TYPE_TRACK); this.trackView = v; } } /** * View holder for the view header. */ public static class HeaderHolder extends Holder { public HeaderHolder(View v) { super(v, VIEW_TYPE_HEADER); } } /** * Interface used to catch event performed on the list. */ public interface Listener { /** * Called when the user performed a swipe to dismiss gesture on the list. * * @param i adapter position of the item which should be removed */ void onTrackDismissed(int i); } }