2017-03-04 86 views
0

我有一个铃声列表视图,每个铃声的每行都有一个播放图像视图。ImageView Button在列表视图内切换

这是它的观点。

Like this

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

现在我有一个问题:

我点击播放按钮,它会变成暂停按钮,但在此期间,当我点击播放按钮从它需要两次点击,直到第二个另一行变成暂停按钮。

这是我的代码:

适配器

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

我将不胜感激,如果是第一次轻触其状态更改为true第二水龙头上,另一排它改变false你可以给我一个更好的逻辑

+0

如果我是理解正确的,你想玩一个水龙头/切换播放。到任何其他行权?因为您可以跟踪现在正在播放的行。停止该行的播放器并播放音频,更改新拍摄的行的图像。 –

+0

你提出了一个很好的观点。你有任何关于如何跟踪播放行的建议吗?我的意思是我必须先停止播放歌曲,然后播放新歌。我知道这与我的原始问题无关,但是如果您可以准备一个answare for它和我会投票给你 – Mehran

回答

2

您正在使用一个pause场的所有行并设置可绘制

product.setPlayPauseId(R.drawable.ic_pause) 

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

您可以定义pause场,每product和内部的if语句检查产品暂停申请

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

下面是这个我所做的是我在RecyclerView流音频铃声从URL中slimier情况..使类变量为 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(假的,假的);

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

//重置媒体播放器 resetResources();

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