我有一个名为ArtistActivity
的活动,其中包含一个RecyclerView,该加载器从Firebase加载歌曲数据并在Artist Activity中显示。我的ArtistActivity
RecyclerView有一个适配器类和一个View Holder类。当我单击RecyclerView中的项目时,它将songUrl
,songName
,songArtist
发送到另一个名为SongPlayingActivity
的活动,该活动需要songUrl
并播放歌曲。
我的主要问题是我的SongPlayingActivity
中有一个下一个按钮,我想在用户单击下一个按钮后加载下一个项目。就像用户单击“下一步”按钮一样,它将停止上一首播放的歌曲并从songList中加载下一首歌曲。就像它在Spotify上的工作方式一样。
希望您能理解我的问题,如果对此有任何答案,请回复。
这是我的代码:-
ArtistActivity:
public class ArtistActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private ValueEventListener eventListener;
private DatabaseReference mDataRef, artist_ref;
private List<PanelList> mList;
private PanelAdapter panelAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.artist1layout);
mRecyclerView = findViewById(R.id.artist_song_recyclerview);
mDataRef = FirebaseDatabase.getInstance().getReference("ArtistView").child(getIntent().getStringExtra("Artist"))
.child("Songs");
mRecyclerView.setHasFixedSize(true);
mDataRef.keepSynced(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mList = new ArrayList<>();
panelAdapter = new PanelAdapter(ArtistActivity.this, mList);
mRecyclerView.setAdapter(panelAdapter);
eventListener = mDataRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
mList.clear();
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
PanelList list = postSnapshot.getValue(PanelList.class);
mList.add(list);
}
panelAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
ViewHolder / Adapter类:
public class PanelAdapter extends RecyclerView.Adapter<PanelAdapter.PanelViewHolder> {
private Context mContext;
private List<PanelList> mUploads;
public PanelAdapter(Context context, List<PanelList> panelList) {
mContext = context;
mUploads = panelList;
}
@NonNull
@Override
public PanelViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(mContext).inflate(R.layout.artist_recycler_layout, parent, false);
return new PanelViewHolder(v);
// Toast.makeText(mContext, "" + ge, Toast.LENGTH_SHORT).show();
}
@Override
public void onBindViewHolder(@NonNull PanelViewHolder holder, int position) {
PanelList panelList = mUploads.get(position);
holder.textViewName.setText(panelList.getSongName());
Glide.with(mContext)
.load(panelList.getSongImageUri())
.centerCrop()
.into(holder.circleImageView);
holder.thisLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String url = panelList.getSongUrl();
Intent playSongActivity = new Intent(mContext, D.class);
playSongActivity.putExtra("SongUrl", panelList.getSongUrl());
mContext.startActivity(playSongActivity);
}
});
}
@Override
public int getItemCount() {
return mUploads.size();
}
public class PanelViewHolder extends RecyclerView.ViewHolder {
private LinearLayout thisLayout;
public PanelViewHolder(@NonNull View itemView) {
super(itemView);
thisLayout = itemView.findViewById(R.id.artist_linear);
}
}
}
代替发送单首歌曲,您可以发送可打包的arrayList,然后单击下一步按钮传递下一首歌曲数据。
在您的onclick上将列表中的所有URL传递给Song Activity类:
holder.thisLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent playSongActivity = new Intent(mContext, D.class);
Bundle bundle = new Bundle();
bundle.putParcelable("SongUrls", mUploads);
bundle.putInt("currentPlayingIndex", position)
playSongActivity.putExtras(bundle);
mContext.startActivity(playSongActivity);
}
});
然后在您的SongActivity类上接收它们,如:
Bundle bundle = getIntent().getExtras();
List<PanelList> panelList = bundle.getParcelable("SongUrls");
Integer currentIndex = bundle.getInt("currentPlayingIndex");
单击下一步按钮的侦听器
String newUrl = panelList[currentindex].getSongUrl();
currentIndex = currentIndex + 1;
不要忘记检查您是否正在播放最后一个数组对象,否则您的应用程序会在将当前播放索引加1时崩溃。
您可以使用Google https://developer.android.com/topic/libraries/architecture/paging中的PagedListAdapter