2014-01-15 110 views
1

现状:的MediaPlayer播放/ ListView中停止

我有了一对夫妇元素和这些元素的自定义列表视图的应用程序有一个播放按钮来播放相应的媒体。本身就很好。 我决定,停止播放剪辑可能是一个好主意,所以我为每个列表视图项目添加了一个“停止”按钮,但设置了GONE的可见性,直到播放某些东西。

代码:

 ImageButton bplay = (ImageButton) itemView.findViewById(R.id.item_bplay); 
     bplay.setTag(currentClip.getFile()); 
     bplay.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       finalItemView.findViewById(R.id.item_bplay).setVisibility(View.GONE); 
       finalItemView.findViewById(R.id.item_bstop).setVisibility(View.VISIBLE); 
       mp.release(); 
       mp = MediaPlayer.create(getApplicationContext(), currentClip.getFile()); 
       mp.start(); 
       mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 

        @Override 
        public void onCompletion(MediaPlayer mp) { 
         finalItemView.findViewById(R.id.item_bplay).setVisibility(View.VISIBLE); 
         finalItemView.findViewById(R.id.item_bstop).setVisibility(View.GONE); 
        } 

       }); 
      } 
     }); 

     ImageButton bstop = (ImageButton) itemView.findViewById(R.id.item_bstop); 
     bstop.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       mp.release(); 
       finalItemView.findViewById(R.id.item_bplay).setVisibility(View.VISIBLE); 
       finalItemView.findViewById(R.id.item_bstop).setVisibility(View.GONE); 
      } 
     }); 

描述:

这工作得很好,只要用户集中于只有一个剪辑。播放按钮被替换为停止按钮,停止按钮停止剪辑,或者如果让剪辑用完,按钮也会切换回来。

问题:

如果用户决定通过点击列表中的第二个元素上播放播放中断,第一个将卡住了停止按钮。由于停止按钮只是执行mp.release(),因此第一个元素的停止按钮现在能够停止播放第二个剪辑。 因为这一切都发生在一个列表视图中,当第二个项目被点击时,我不再有权访问第一个来重新替换按钮。 我寻找一种方法来捕获中断(很像mp.setOnCompletionListener寻找成功完成)并重置按钮,但到目前为止,我无法提出任何事情。 我其实喜欢这样一个事实,通过先放置发布,然后创建一个新的mediaplayer然后启动它,用户可以通过在另一个剪辑上按下Play来快速切换剪辑。我只想让原始剪辑上的“停止”按钮消失,一旦新剪辑启动。

问题:

  • 我怎么赶,当用户决定切换到另一个剪辑没有停止的第一个?
  • 我的切换按钮的方法是否有意义?有更好的选择吗?

回答

0

如果您制作了处理MediaPlayer的服务,则可以向其发送意图以控制播放/停止。在游戏意图中,您可以包含一个PendingIntent,当完成当前正在播放的媒体或由其他剪辑启动时,由于某种原因停止当前播放的媒体时,该服务会将该PendingIntent发送回UI。

PendingIntent由列表项的onClick回调生成,所以它会自动调用正确的列表项回调并重置按钮。

+0

谢谢您的回复。我会仔细看看的。 –

0
  • 当用户决定切换到另一个剪辑而不停止第一个剪辑时,该如何捕捉?

我认为setOnCompletionListener可能是一个好主意,但不是release(),你应该调用stop()方法。如果它不能帮助你也可以跳过流到非常结束(seekTo(getDuration())方法)。这definietly将调用CompletionListener

  • 我的方法切换按钮是否有意义呢?有更好的选择吗?

我认为你不需要使用ImageButton。添加到您的适配器“选定”字段,您可以记住上次选择的项目的编号。在getView()中,你可以检查一些行是“被选中”,并使适当的图像(播放/暂停)可见。然后将OnItemClickListener接口添加到您的Adapter类。当调用onItemClick方法时,检查是否相同(然后暂停流并使“selected”字段为空)或new(然后播放流并将新行号分配给“selected”字段)行被选中。使用notifyDataSetChanged()方法调用,以在列表视图中生成具有正确图像的新行。

+0

OnCompletionListener没有得到,当有另一个项目中断时,由于每个Play呼叫以mp.release()开头,前一个mp实例刚被取消。 –

+0

此外,我确实需要ImageButton,因为项目由一个textview和四个ImageButtons组成,在自定义列表视图中,如果列表项被点击,我不只是想要播放该项目。 问题的意思是:更换一个按钮的drawable和方法是否更容易使用同一个按钮来切换Play和Stop,或者更有意义的是有一个单独的Play和Stop按钮,但通过VISIBLE和GONE只能以完全相同的位置向用户展示一个。 –

+0

对用户来说,这并没有什么不同,他们看到一个播放按钮,一旦他们点击它,同一个地方就会出现一个停止按钮,但是Java中的方法存在不同,这就是为什么我问。我没有计划放弃用户已经习惯的整个布局。 –