草庐IT

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

coder 2023-12-02 原文

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

这是我的问题:

示例 1(这很好用):

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

例2(就是这个问题)

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

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

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

这是我的 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/

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

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  4. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  5. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  6. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  7. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  8. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  9. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  10. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

随机推荐