ImageView 按钮在列表视图中切换

ImageView Button Toggle inside listview

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

这是对它的看法。

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

现在我有一个问题:

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

这是我的代码:

适配器

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

Activity

    @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){
  }

如果你能给我一个更好的逻辑,我将不胜感激

您正在为所有行使用一个 pause 字段,因此第一次点击将其状态更改为 true,第二次点击另一行将其更改为 false 并且集合可绘制对象

 product.setPlayPauseId(R.drawable.ic_pause)

在第一行和第三次点击工作正常。

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

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

这是一个更简单的案例,我所做的是我在 RecyclerView 中从 url 流式传输音频铃声 .. 将 class 变量设为 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);
}