我有一个带有媒体播放器的回收视图,可以在每一行播放一首歌。我只有一个播放/停止按钮,可以改变符号。
这是我的问题:
示例1(这很好):
(对于适配器位置1),用户点击播放符号并播放该适配器位置的音乐,符号变为停止符号,然后点击停止符号,音乐停止,符号变回播放符号准备再次开始音乐。
示例2(这是问题)
(对于适配器位置1),用户点击播放符号并播放该适配器位置的音乐,并且符号变为停止符号。如果没有再按下该按钮,他们就会点击播放符号(适配器位置3),所以现在他们正在尝试同时播放位置1和3上的歌曲。我已经修复了同时播放的两首歌曲,以便在按下第二首歌曲时重置播放的媒体并将源歌曲文件更改为新歌曲(一次只播放一首歌曲)。
即使媒体播放器表现得如此,问题仍然存在。媒体播放器在主要活动中受到控制。播放/停止按钮(imageview)图像在适配器视图中更改,当同时点击多首歌曲时,我无法改变播放/停止符号的方法。
此图像显示已按下歌曲1和歌曲3的示例。现在只播放第3首歌曲但图像仍然显示两首歌曲同时播放。
这是我的视图持有者,我处理更改播放/停止图像并发送歌曲点击回调:
class AddVideoAudioViewHolder extends RecyclerView.ViewHolder{
ImageView PlayButton;
Button AddAudioButton;
TextView Title;
public AddVideoAudioViewHolder(View itemView) {
super(itemView);
PlayButton = (ImageView) itemView.findViewById(R.id.PlayStopAudioDemo);
PlayButton.setTag(1);
PlayButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int PlayStopButtonState = (int) PlayButton.getTag();
if (PlayStopButtonState == 1) {
mVideoAudioCallbacks.onClick(100 + getAdapterPosition());
PlayButton.setImageResource(R.drawable.playstop);
PlayButton.setTag(2);
} else {
mVideoAudioCallbacks.onClick(200 + getAdapterPosition());
PlayButton.setImageResource(R.drawable.playarrow);
PlayButton.setTag(1);
}
}
});
这是主要活动的方法,我处理两首歌曲的情况:
public void PlaySong (int SongNumber, int ObjectInt){
if (mp == null) {
mp = new MediaPlayer();
}else{
mp.reset();
}
try {
mp.setDataSource(this, Uri.parse("android.resource://com.example.nick.accountable/" + SongArray[SongNumber]));
} catch (IOException e) {
e.printStackTrace();
}
try {
mp.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mp.start();
}
所以我的问题是我可以在视图持有者或主活动中添加一些代码,这些代码可以更改除当前适配器位置之外的所有其他视图。即如果单击歌曲编号3进行播放,请将图像设置为位置1-2& 4-10没有比赛,或者有更好的方法。
感谢您的帮助 尼古拉斯
答案 0 :(得分:6)
在你的适配器中有一个int变量来保持正在播放的位置
int mCurrentPlayingPosition = -1; // if -1 nothing is playing
在点击监听器的播放按钮中,执行此操作
PlayButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int PlayStopButtonState = (int) PlayButton.getTag();
int previousPosition = mCurrentPlayingPosition;
if (PlayStopButtonState == 1) {
mCurrentPlayingPosition = getAdapterPosition();
mVideoAudioCallbacks.onClick(100 + getAdapterPosition());
PlayButton.setImageResource(R.drawable.playstop);
PlayButton.setTag(2);
} else {
mCurrentPlayingPosition = -1; // nothing wil be played after hitting stop
mVideoAudioCallbacks.onClick(200 + getAdapterPosition());
PlayButton.setImageResource(R.drawable.playarrow);
PlayButton.setTag(1);
}
if(previousPosition != -1)
notifyItemChanged(previousPosition);
}
});
你的onBindViewHolder中的执行以下操作
@Override
public void onBindViewHolder(AddVideoAudioViewHolder holder, int position) {
if(mCurrentPlayingPosition == position ){
// display stop icon
} else {
// display play icon
}
}
答案 1 :(得分:0)
如果您想要在特定行上执行某项操作时更改所有其他视图,则可以调用notifyDataSetChanged()
并在onBindViewHolder