I show music list using RecyclerView. In every item I have ImageView which showing current music playing in it. I use service for playing music. My problem is when one music completed, he start playing next music and in Recyclerview item also have to show playing in next item. How can I implement this.
I tried to use listener. When music completed in MusicService class override method
@Override
public void onCompletion(MediaPlayer mp) {
if(player.getCurrentPosition()>0){
mp.reset();
playNext();
trackCompleted.letTrackCompleted();
changeInfo.setTrackInfo();
}
}
When this method occured I try let know adapter that music completed. And manually try change icon of playing item
@Override
public void letTrackCompleted() {
notifyItemChanged(selected_position);
selected_position= selected_position+1;
notifyItemChanged(selected_position);
}
MusicAdapter.class
private Context mContext;
private RecyclerView recyclerView;
int selected_position = 0;
int playing_position = 0;
private ArrayList<Song> songs = null;
public static SongPick songPick;
SharedPreferences sPref;
View myItemView;
MusicService musicService = new MusicService();
public KuilerAdapter(Context mContext, ArrayList<Song> theSongs, RecyclerView recyclerView) {
this.mContext = mContext;
this.recyclerView = recyclerView;
songs=theSongs;
sPref = mContext.getSharedPreferences("position",Context.MODE_PRIVATE);
musicService.setTrackCompletedListener(this);
}
@Override
public void letTrackCompleted() {
notifyItemChanged(selected_position);
selected_position= selected_position+1;
notifyItemChanged(selected_position);
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public LinearLayout llSong;
public TextView tvSongTitle;
public TextView tvSongDescription;
public ImageView imgEq;
public MyViewHolder(View view) {
super(view);
llSong = (LinearLayout) view.findViewById(R.id.ll_song);
tvSongTitle = (TextView)view.findViewById(R.id.song_title);
tvSongDescription = (TextView)view.findViewById(R.id.song_description);
imgEq = (ImageView) view.findViewById(R.id.play_eq);
}
}
@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
final View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.d_media_list_item, parent, false);
myItemView = itemView;
musicService.setMusicInfoListener(this);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
Song currSong = songs.get(position);
holder.tvSongTitle.setText(currSong.getTitle());
holder.tvSongDescription.setText(currSong.getArtist());
holder.llSong.setTag(position);
sPref = mContext.getSharedPreferences("position", Context.MODE_PRIVATE);
selected_position = sPref.getInt("position", 0);
if(selected_position == position){
AnimationDrawable animation = (AnimationDrawable)
ContextCompat.getDrawable(mContext, R.drawable.ic_equalizer_white_36dp);
DrawableCompat.setTintList(animation, ColorStateList.valueOf(ContextCompat.getColor(mContext,
R.color.media_item_icon_playing)));
holder.imgEq.setImageDrawable(animation);
holder.imgEq.setVisibility(View.VISIBLE);
animation.start();
}
else{
holder.imgEq.setImageResource(R.drawable.ic_play_arrow_black);
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("pl", "Click");
notifyItemChanged(selected_position);
selected_position = position;
notifyItemChanged(selected_position);
playing_position = position;
songPick.songPicked(holder.itemView);
AnimationDrawable animation = (AnimationDrawable)
ContextCompat.getDrawable(mContext, R.drawable.ic_equalizer_white_36dp);
DrawableCompat.setTintList(animation, ColorStateList.valueOf(ContextCompat.getColor(mContext,
R.color.media_item_icon_playing)));
holder.imgEq.setImageDrawable(animation);
holder.imgEq.setVisibility(View.VISIBLE);
animation.start();
SharedPreferences.Editor editor = sPref.edit();
editor.putInt("position", selected_position);
editor.commit();
}
});
}
@Override
public int getItemCount() {
return songs.size();
}
void setSongPickedListener(SongPick sp){
songPick = sp;
}
}
MusicService.java
public static final String EXTRA_CONNECTED_CAST = "com.example.android.uamp.CAST_NAME";
private String songTitle="";
private String songArtist = "";
private static final int NOTIFY_ID=1;
private boolean shuffle=false;
private Random rand;
//media player
private MediaPlayer player;
//song list
private ArrayList<Song> songs;
//current position
private int songPosn;
private final IBinder musicBind = new MusicBinder();
public static ChangeInfo changeInfo;
public static TrackCompleted trackCompleted;
public void onCreate(){
//create the service
super.onCreate();
//initialize position
songPosn=0;
//create player
player = new MediaPlayer();
initMusicPlayer();
//for shuffle
rand=new Random();
}
public void initMusicPlayer(){
//set player properties
player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setOnPreparedListener(this);
player.setOnCompletionListener(this);
player.setOnErrorListener(this);
}
public void setList(ArrayList<Song> theSongs){
songs=theSongs;
}
public void setSong(int songIndex){
songPosn=songIndex;
}
public class MusicBinder extends Binder {
public MusicService getService() {
return MusicService.this;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return musicBind;
}
@Override
public boolean onUnbind(Intent intent){
// player.stop();
// player.release();
return false;
}
public void playSong(){
//play a song
player.reset();
//get song
Song playSong = songs.get(songPosn);
songTitle=playSong.getTitle();
songArtist = playSong.getArtist();
//get id
long currSong = playSong.getID();
//set uri
Uri trackUri = ContentUris.withAppendedId(
android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
currSong);
try{
player.setDataSource(getApplicationContext(), trackUri);
}
catch(Exception e){
Log.e("MUSIC SERVICE", "Error setting data source", e);
}
player.prepareAsync();
}
@Override
public void onDestroy() {
stopForeground(true);
}
@Override
public void onCompletion(MediaPlayer mp) {
if(player.getCurrentPosition()>0){
mp.reset();
playNext();
trackCompleted.letTrackCompleted();
changeInfo.setTrackInfo();
}
}