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

Posted

技术标签:

【中文标题】Recyclerview 视图可以更改其他适配器位置(不是当前位置)的视图?【英文标题】:Recyclerview viewholder possible to change views at other adapter positions (not current position)? 【发布时间】:2016-05-19 04:47:54 【问题描述】:

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

这是我的问题:

示例 1(效果很好):

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

示例 2(这是问题所在)

(对于适配器位置 1)用户点击播放符号并在该适配器位置播放音乐,并且该符号变为停止符号。无需再次点击该按钮,他们就会点击播放符号(适配器位置 3),因此现在他们正尝试同时在位置 1 和 3 上播放歌曲。我已经修复了两首歌曲同时播放的问题,这样当第二首歌曲被按下时,播放的媒体被重置并且源歌曲文件被更改为新歌曲(一次只能播放一首)。

即使媒体播放器的行为正常,问题也随之而来。媒体播放器在 mainactivity 中被控制。适配器视图中的播放/停止按钮 (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();




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

感谢您的帮助 尼古拉斯

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的帮助。【参考方案2】:

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

【讨论】:

我不确定如何应用它。数据集没有改变。你是说我应该有一个布尔数组来代表 imageview 按钮的状态(播放/停止)?在单击按钮时执行此操作是否存在内存问题? 感谢您的帮助。

以上是关于Recyclerview 视图可以更改其他适配器位置(不是当前位置)的视图?的主要内容,如果未能解决你的问题,请参考以下文章

RecyclerView 适配器 - 列表正在更新,但视图没有

RecyclerView中的多个视图

recyclerView 没有适配器附加,跳过布局

如何 android recyclerview 更改不同的持有者视图背景

使用数据绑定的具有多个视图类型的 Android recyclerview 适配器

Recyclerview 行图像未显示