如何在专辑选项卡中播放歌曲



我无法在专辑选项卡中播放歌曲。但歌曲在所有歌曲选项卡中播放良好。甚至在运行应用程序时没有显示错误或警告。。这是我的相册片段

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 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;
}
}

这是相册模型类。。

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 "";
}
}
}

歌曲片段

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);
}

}

在看到您的SongFragment后,我能够提供答案。

在您的AlbumsFragment中,您有一个handleAllListener,但您从不调用您的MusicService。尝试将AlbumsFragment更改为:

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);
}

}

完成此操作后,您现在可以像在SongAdapter中一样调用OnClickListener

如果您提供SongAdapter,我可以为您编辑您的AlbumAdapter


编辑:在提供SongAdapter之后。

您可以将AlbumAdapter更改为:

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;
}
}

最新更新