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

Recyclerview viewholder possible to change views at other adapter positions (not current position)?

我有一个带媒体播放器的 recyclerview,可以在每一行播放一首歌曲。我只有一个 play/stop 按钮可以更改符号。

这是我的问题:

示例 1(效果很好):

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

例2(就是这个问题)

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

即使媒体播放器正常运行,问题也会出现。媒体播放器在 mainactivity 中控制。 play/stop 按钮 (imageview) 图像在适配器查看器中发生了更改,当同时单击多首歌曲时,我无法找到更改 play/stop 符号的方法。

此图显示歌曲 1 和歌曲 3 均已按下的示例。现在只有歌曲 3 在播放,但图像仍然显示,好像两首歌曲同时播放。

这是我的视图持有者,我在其中处理更改 play/stop 图像并发送歌曲点击回调:

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



}

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

感谢您的帮助 尼古拉斯

如果你想在对特定行执行操作时更改所有其他视图,你可以调用 notifyDataSetChanged() 并编写特定的 if else 来解决你在 onBindViewHolder

中的问题

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