Search code examples
androidandroid-adapterandroid-music-player

How to Play song in Albums Tab?


I cant able to play songs in Albums Tab. But song is playing well in All Songs Tab..Even Not showing an error or warning when i run the app.. This is my AlbumFragment

 public class AlbumsFragment extends MusicServiceFragment {
private final String TAG="AlbumsFragment";
private MusicService musicService;
private boolean musicServiceStatus = false;
private List<AlbumModel> albums;
private RecyclerView recyclerView;
private AlbumAdapter adapter;


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_albums, container, false);
    recyclerView = rootView.findViewById(R.id.rv_album_list);
    albums = new ArrayList<>();
    adapter = new AlbumAdapter(albums, getContext());
    recyclerView.setHasFixedSize(true);
    GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 2);
    recyclerView.setLayoutManager(gridLayoutManager);
    recyclerView.setAdapter(adapter);
    if (musicServiceStatus) { initFragment(); }
    return rootView;
}

@Override
public void onServiceConnected(MusicService musicService) {
    this.musicService = musicService;
    musicServiceStatus=true;
    initFragment();
}

@Override
public void onServiceDisconnected() {

}

public void initFragment() {
    albums = musicService.getAlbums();
    adapter = new AlbumAdapter(albums, getContext());
    recyclerView.setAdapter(adapter);
    handleAllListener();
}

public void handleAllListener() {
    adapter.setAlbumClickListener((v, album, pos) -> Log.d(TAG, album.getArtistName()));
}

}

This is Album Adapter ..No Errors or warning..If you could help in this am very thankful to you..Playing well if is select all songs tab but when i move to albums tab and click song its not playing but getting songs without error

  public class AlbumAdapter extends       RecyclerView.Adapter<AlbumAdapter.ViewHolder> {
private List<AlbumModel> albums;
Context context;
private AlbumClickListener albumClickListener;

AlbumAdapter(List<AlbumModel> albums, Context context) {
    this.albums = albums;
    this.context = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_album,parent,false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    final AlbumModel albumModel = albums.get(position);
    holder.albumName.setText(albumModel.getName());
    holder.albumNoOfSong.setText(albumModel.getNoOfSong()+ " songs");
    Picasso.with(context).load(albumModel.getCoverArt()).placeholder(R.drawable.default_album_icon).into(holder.albumImage);
    holder.cardView.setOnClickListener(view -> albumClickListener.OnAlbumClickListener(view,albums.get(position),position));

}

@Override
public int getItemCount() {
    return albums.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    ImageView albumImage;
    TextView albumName;
    TextView albumNoOfSong;
    CardView cardView;

    ViewHolder(View itemView) {
        super(itemView);
        albumImage = (ImageView)itemView.findViewById(R.id.iv_album_image);
        albumName = (TextView)itemView.findViewById(R.id.tv_album_name);
        albumNoOfSong=(TextView)itemView.findViewById(R.id.tv_album_no_of_song);
        cardView = (CardView)itemView.findViewById(R.id.cv_item_album);
    }
}
public interface AlbumClickListener {
    void OnAlbumClickListener(View v, AlbumModel album, int pos);
}
void setAlbumClickListener(AlbumClickListener albumClickListener) {
    this.albumClickListener = albumClickListener;
     }
 }

This is Album Model Class..

 public class AlbumModel {
private final ArrayList<SongModel> songs;
public int id;

AlbumModel(ArrayList<SongModel> songs) {
    this.songs = songs;
}
public void setId(int i) {
    this.id=i;
}
public ArrayList<SongModel> getAlbumSongs() {
    return songs;
}

public  String getName() {
    if(songs.size()>0) {
        return songs.get(0).getAlbumName();
    }else {
        return " ";
    }
}
int getNoOfSong() {
    return songs.size();
}

String getCoverArt() {
    if(songs.size()>0) {
        return songs.get(0).getAlbumArt();
    }else {
        return " ";
    }
}

int getArtistId() {
    if(songs.size()>0) {
        return songs.get(0).getArtistId();
    }else {
        return 0;
    }
}
public String getArtistName() {
 if(songs.size()>0) {
        return songs.get(0).getArtistName();
    }else {
        return "";
       }
     }
 }

SongFragment...

 public class SongFragment extends MusicServiceFragment {

public static final String TAG="SongListFragment";

RecyclerView recyclerView;
List<SongModel> songs;
SongAdapter adapter;
private MusicService musicSrv;
boolean musicServiceStatus = false;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootview = inflater.inflate(R.layout.fragment_song, container, false);
    songs=new ArrayList<>();
    recyclerView=rootview.findViewById(R.id.rv_song_list);
    adapter=new SongAdapter(songs,getContext());
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setAdapter(adapter);
    if(musicServiceStatus) {
        initFragment();
    }
    return rootview;
}

@Override
public void onServiceConnected(MusicService musicService) {
    musicSrv = musicService;
    musicServiceStatus=true;
    initFragment();
}

@Override
public void onServiceDisconnected() {

}

public void handleSongClick() {

    //click on song item title and artist name listener
    adapter.setOnSongItemClickListener((v, song, pos) -> {
        Log.d(TAG,song.getTitle());
        playSong(song);
    });

    // long click on song title and artist listener
    adapter.setOnSongItemLongClickListener((v, song, pos) -> Log.d(TAG,"onsongitemclick listener testing"));

    // song menu click listener
    adapter.setOnSongBtnClickListener((btn, v, song, pos) -> {
        final PopupMenu popupMenu=new PopupMenu(getContext(),btn);
        popupMenu.getMenuInflater().inflate(R.menu.song_action_menu,popupMenu.getMenu());
        popupMenu.setOnMenuItemClickListener(item -> {
            if(item.getTitle().equals("Play")) {
                playSong(song);
            }
            return false;
        });
        popupMenu.show();
    });
}

//initialize all the component
public void initFragment() {
    songs=musicSrv.getSongs();
    Log.d(TAG,songs.get(0).getTitle());
    adapter=new SongAdapter(songs,getContext());
    recyclerView.setAdapter(adapter);
    handleSongClick();
}

//make some changes while playing the songs
public void playSong(SongModel song) {
    musicSrv.play(song);
}

}


Solution

  • After seeing your SongFragment I am able to provide a answer.

    In your AlbumsFragment you have a handleAllListener but you never call your MusicService. Try changing your AlbumsFragment to this:

    public class AlbumsFragment extends MusicServiceFragment {
    private final String TAG="AlbumsFragment";
    private MusicService musicService;
    private boolean musicServiceStatus = false;
    private List<AlbumModel> albums;
    private RecyclerView recyclerView;
    private AlbumAdapter adapter;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_albums, container, false);
            recyclerView = rootView.findViewById(R.id.rv_album_list);
            albums = new ArrayList<>();
            adapter = new AlbumAdapter(albums, getContext());
            recyclerView.setHasFixedSize(true);
            GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 2);
            recyclerView.setLayoutManager(gridLayoutManager);
            recyclerView.setAdapter(adapter);
            if (musicServiceStatus) { initFragment(); }
            return rootView;
        }
    
        @Override
        public void onServiceConnected(MusicService musicService) {
            this.musicService = musicService;
            musicServiceStatus=true;
            initFragment();
        }
    
        @Override
        public void onServiceDisconnected() {
    
        }
    
        public void initFragment() {
            albums = musicService.getAlbums();
            adapter = new AlbumAdapter(albums, getContext());
            recyclerView.setAdapter(adapter);
            handleAllListener();
        }
    
        public void handleAllListener() {
            adapter.setAlbumClickListener((v, album, pos) -> Log.d(TAG, album.getArtistName()));
        }
    
        public void handleAlbumClick() {
            //click on song item title and artist name listener
            adapter.setOnAlbumItemClickListener((v, song, pos) {
            Log.d(TAG,song.getTitle());
            playSong(song);
        });
    
        // song menu click listener
        adapter.setOnAlbumBtnClickListener((btn, v, song, pos) {
            final PopupMenu popupMenu=new PopupMenu(getContext(),btn);
            popupMenu.getMenuInflater().inflate(R.menu.song_action_menu,popupMenu.getMenu());
            popupMenu.setOnMenuItemClickListener(item) {
                if(item.getTitle().equals("Play")) {
                    playSong(song);
                }
                return false;
                });
                popupMenu.show();
            });
        }
    
        //make some changes while playing the songs
        public void playSong(AlbumModel song) {
            musicService(song);
        }
    
    
    }
    

    After doing this, you can now call the OnClickListener the same way as you did in you SongAdapter.

    I can edit your AlbumAdapter for you, if you provide your SongAdapter.


    Edit: After providing SongAdapter.

    You can change your AlbumAdapter to this:

    public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder> {
    private List<AlbumModel> albums;
    Context context;
    
    private AlbumClickListener albumClickListener;
    private AlbumItemLongClickListener albumItemLongClickListener;
    private AlbumBtnClickListener albumBtnClickListener;
    
    AlbumAdapter(List<AlbumModel> albums, Context context) {
        this.albums = albums;
        this.context = context;
    }
    
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_album, parent, false);
        return new ViewHolder(v);
    }
    
    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        final AlbumModel albumModel = albums.get(position);
        holder.albumName.setText(albumModel.getName());
        holder.albumNoOfSong.setText(albumModel.getNoOfSong() + " songs");
    
        if (albumModel.getAlbumArt() != "") {
            Picasso.with(context).load(albumModel.getCoverArt()).placeholder(R.drawable.default_album_icon).into(holder.albumImage);
        }
        holder.constraintLayout.setOnClickListener(view -> {
            if (albumItemClickListener != null) {
                albumItemClickListener.onAlbumItemClick(view, album, position);
            }
        });
    
        holder.constraintLayout.setOnLongClickListener(view -> {
            if (albumItemLongClickListener != null) {
                albumItemLongClickListener.onAlbumItemLongClickListener(view, album, position);
            }
            return true;
        });
    
        holder.albumMenuBtn.setOnClickListener(view -> {
            if (albumBtnClickListener != null) {
                albumBtnClickListener.onAlbumBtnClickListener(holder.albumMenuBtn, view, album, position);
            }
        });
    
    
    }
    
    @Override
    public int getItemCount() {
        return albums.size();
    }
    
    public class ViewHolder extends RecyclerView.ViewHolder {
        ImageView albumImage;
        TextView albumName;
        TextView albumNoOfSong;
        CardView cardView;
    
        ViewHolder(View itemView) {
            super(itemView);
            albumImage = (ImageView) itemView.findViewById(R.id.iv_album_image);
            albumName = (TextView) itemView.findViewById(R.id.tv_album_name);
            albumNoOfSong = (TextView) itemView.findViewById(R.id.tv_album_no_of_song);
            cardView = (CardView) itemView.findViewById(R.id.cv_item_album);
        }
    }
    
    
        // Custom Interfaces and its method implementations
        public interface AlbumClickListener {
            void onAlbumItemClick(View v, AlbumModel album, int pos);
        }
    
        public interface AlbumItemLongClickListener {
            void onAlbumItemLongClickListener(View v, AlbumModel album, int pos);
        }
    
        public interface AlbumBtnClickListener {
            void onAlbumBtnClickListener(ImageButton btn, View v, AlbumModel album, int pos);
        }
    
        public void setOnAlbumItemClickListener(AlbumItemClickListener albumItemClickListener) {
            this.albumItemClickListener = albumItemClickListener;
        }
    
        public void setOnAlbumItemLongClickListener(AlbumItemLongClickListener albumItemLongClickListener) {
            this.albumItemLongClickListener = albumItemLongClickListener;
        }
    
        public void setOnAlbumBtnClickListener(AlbumBtnClickListener albumBtnClickListener) {
            this.albumBtnClickListener = albumBtnClickListener;
        }
    
    }