我有一个带有mediaplayer的循环视图,可以在每一行播放一首歌曲。我只有一个播放/停止按钮,可以改变符号。
这就是我的问题:
示例1(这很好用):
(对于适配器位置1)用户点击播放符号并且为该适配器位置播放音乐并且该符号改变为停止符号,然后他们点击停止符号并且音乐停止并且该符号改变回准备再次开始音乐的播放符号。
示例2(这就是问题所在)
(对于适配器位置1)用户点击播放符号,并且该适配器位置的音乐播放,并且该符号变为停止符号。不需要再次点击该按钮,他们就会点击播放符号(适配器位置3),所以现在他们试图同时在位置1和3上播放这首歌。我已经修复了同时播放两首歌曲的问题,因此当按下第二首歌曲时,播放的媒体将被重置,源歌曲文件将更改为新歌曲(一次只能播放一首)。
然后,即使媒体播放器的行为与其应有的行为相同,问题也会出现。媒体播放器在主活动中被控制。播放/停止按钮(图像视图)图像在适配器视频文件夹中被更改,当同时单击多首歌曲时,我找不到更改播放/停止符号的方法。
此图像显示了歌曲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);
}
}
});这是main活动中的方法,其中我处理两首歌曲播放的情况:
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的图像设置为不播放,或者是否有更好的方法进行播放。
谢谢你的帮助,尼古拉斯
发布于 2016-02-09 17:40:57
在您适配器中有一个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
}
}发布于 2016-02-09 17:25:13
如果您希望在对特定行执行操作时更改所有其他视图,则可以调用notifyDataSetChanged()并编写solve If else来解决onBindViewHolder中的问题
https://stackoverflow.com/questions/35288013
复制相似问题