gpt4 book ai didi

android - Recyclerview viewholder 可以更改其他适配器位置(不是当前位置)的 View 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:53:54 25 4
gpt4 key购买 nike

我有一个带媒体播放器的 recyclerview,可以在每一行播放一首歌曲。我只有一个用于播放/停止的按钮,它会改变符号。

这是我的问题:

示例 1(这很好用):

(对于适配器位置 1)用户按下播放符号,音乐在该适配器位置播放,符号变为停止符号,然后他们按下停止符号,音乐停止,符号变回播放符号准备好再次开始音乐。

例2(就是这个问题)

(对于适配器位置 1)用户点击播放符号,音乐会为该适配器位置播放,并且该符号变为停止符号。在没有再次按下该按钮的情况下,他们随后按下了播放符号(适配器位置 3),因此现在他们正在尝试同时在位置 1 和 3 上播放歌曲。我修复了同时播放两首歌曲的问题,以便在按下第二首歌曲时重置播放的媒体并将源歌曲文件更改为新歌曲(一次只播放一首)。

即使媒体播放器正常运行,问题也会出现。媒体播放器在主要 Activity 中进行控制。适配器取景器中的播放/停止按钮( ImageView )图像已更改,同时单击多首歌曲时我无法找到更改播放/停止符号的方法。

此图显示了同时按下歌曲 1 和歌曲 3 的示例。现在只有歌曲 3 正在播放,但图像仍在显示,就好像两首歌曲同时播放一样。

enter image description here

这是我的 View 持有者,我在其中处理更改播放/停止图像并发送歌曲点击回调:

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


}
});

这是主要 Activity 中我处理两首歌曲播放情况的方法:

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



}

所以我的问题是我可以在 View 持有者或主要 Activity 中添加一些代码,这些代码可以更改除当前适配器位置之外的所有其他 View 。 IE。如果点击播放第3首歌曲,请将位置1-2和4-10的图像设置为不播放或者有更好的方法吗。

感谢您的帮助尼古拉斯

最佳答案

在你的适配器中有一个 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
}
}

关于android - Recyclerview viewholder 可以更改其他适配器位置(不是当前位置)的 View 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35288013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com