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

How to Play song in Albums Tab?

我无法在“专辑”选项卡中播放歌曲。但是歌曲在“所有歌曲”选项卡中播放得很好。即使我 运行 应用程序时也没有显示错误或警告。 这是我的专辑片段

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

}

这是专辑适配器..没有错误或警告..如果你能在这方面提供帮助,我非常感谢你..如果是 select 所有歌曲选项卡但当我移动到专辑选项卡并且单击歌曲未播放但无错误地获取歌曲

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

这是专辑模特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 "";
       }
     }
 }

歌曲片段...

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

}