【问题标题】:ImageView Button Toggle inside listview列表视图内的 ImageView 按钮切换
【发布时间】:2017-07-24 10:18:48
【问题描述】:

我有一个铃声列表视图,每个铃声的每一行都有一个播放图像视图。

这是它的视图。

现在很明显,当用户点击播放按钮时,它应该切换到暂停按钮。

现在我有一个问题:

我点击一个播放按钮,它会变成暂停按钮,但与此同时,当我点击另一行的播放按钮时,需要点击两次,直到第二次变成暂停按钮。

这是我的代码:

适配器

    Product product = (Product) mDataItems.get(position);
    holder.playPause=(ImageView)v.findViewById(R.id.playPause); 
    holder.playPause.setImageResource(product.getPlayPauseId());
    holder.playPause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
              if (callback != null) {
                  callback.playPauseOnClick(position);
              }      
        }
    });

活动

    @Override
public void playPauseOnClick(int position) {
    final Product product = productList.get(position);
                if (paused) {
                    product.setPlayPauseId(R.drawable.ic_pause);
                paused=false;
                }else {
                    product.setPlayPauseId(R.drawable.ic_play);
                 paused = true;
                }
                adapter.notifyDataSetChanged();     
    };

我已经猜到问题出在我的身上

if(paused){
  }

如果您能提供更好的逻辑,我将不胜感激

【问题讨论】:

  • 如果我理解正确,您想一键播放/切换播放。到任何其他行对吗?为此,您可以跟踪当前正在播放的行.. 停止该行的播放器并播放音频,更改新点击行的图像。
  • 你说得很好......你对如何跟踪播放行有什么建议吗?我的意思是我必须先停止播放歌曲,然后播放新歌曲。我知道这有与我最初的问题无关,但如果你可以为它准备一个答案,我会投票给你

标签: android listview android-studio adapter baseadapter


【解决方案1】:

您正在为所有行使用一个pause 字段,因此第一次点击将其状态更改为true,第二次点击另一行将其更改为false 并设置drawable

 product.setPlayPauseId(R.drawable.ic_pause)

在第一行和第三个水龙头工作正常。

您可以为每个 product 定义 pause 字段,并在 if 子句中检查产品暂停字段

if(product.pause){
    ...
    product.paused = false;
}else{
    product.paused = true;
}

【讨论】:

    【解决方案2】:

    这是一个更简单的案例,我所做的是我从 RecyclerView 中的 url 流式传输音频铃声 .. 将类变量设置为 private int oldPosition = -1; ,使用此变量,您将跟踪 RecyclerView 中当前正在播放音频的行

     @Override
    public void onRecyclerViewChildItemClick(BaseRecyclerViewHolder holder, int resourceId) {
        super.onRecyclerViewChildItemClick(holder, resourceId);
        switch (resourceId) {
            case R.id.media_play_container:
                int position = holder.getAdapterPosition();
                if (oldPosition != -1)
                    resetResources();
                if (oldPosition == position) {
                    resetResources();
                    oldPosition = -1;
                    return;
                }
                updateViewAtPosition(false, false); // update old selected view
                oldPosition = position;     // update position
                BaseRecyclerViewAdapter adapter = (BaseRecyclerViewAdapter) getRecyclerView().getAdapter();
                AudioItem item = (AudioItem) adapter.getItemAt(oldPosition);
                String url = item.getAudioPreviewUrl();
                // if url is valid show progress and play
                if (AppUtils.ifNotNullEmpty(url)) {
                    updateViewAtPosition(true, false);
                    playRingtone(url);
                }
                break;
            case R.id.iv_media_favorite:
                break;
        }
    }
    

    此方法更新正在播放的旧行 updateViewAtPosition(false, false);

    private void updateViewAtPosition(boolean isLoading, boolean isPlaying) {
        RecyclerView recyclerView = getRecyclerView();
        if (recyclerView == null || oldPosition == -1)
            return;
        BaseRecyclerViewAdapter adapter = (BaseRecyclerViewAdapter) recyclerView.getAdapter();
        if (adapter == null)
            return;
        AudioItem item = (AudioItem) adapter.getItemAt(oldPosition);
        item.setPlaying(isPlaying);
        item.setLoading(isLoading);
        adapter.update(oldPosition, item);
        adapter.notifyItemChanged(oldPosition);
    }
    

    // 重置媒体播放器 重置资源();

    private void resetResources() {
        resetMediaPlayer();
        resetViewResources();
    }
    
    private void resetMediaPlayer() {
        try {
            if (mediaPlayer != null) {
                if (mediaPlayer.isPlaying())
                    mediaPlayer.stop();
                mediaPlayer.reset();
            }
        } catch (Exception e) {
            Logger.caughtException(e);
        }
    }
    
    private void resetViewResources() {
        if (oldPosition == -1)
            return;
        updateViewAtPosition(false, false);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2023-03-26
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      相关资源
      最近更新 更多