列表视图中的MediaPlayer播放/停止



情况:

我有一个应用程序,它有几个元素的自定义列表视图,这些元素有一个播放按钮来播放相应的媒体。就其本身而言,这非常有效。我决定,可以停止播放剪辑可能是个好主意,所以我在每个列表视图项中添加了一个"停止"按钮,但将可见性设置为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的服务,你可以向它发送意图来控制播放/停止。在播放意图中,您可以包括一个PendingIntent,当当前播放的媒体因任何原因停止时,服务会将其发送回UI,无论是完成还是启动其他剪辑。

PendingIntent是由列表项的onClick回调生成的,因此它将自动调用正确的列表项回调并重置按钮。

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

我认为setOnCompletionListener可能是个好主意,但您应该调用stop()方法而不是release()。如果没有帮助,您也可以直接跳过流到最后(请参见kTo(getDuration())方法)。这显然会调用CompletionListener

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

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

最新更新