情况:
我有一个应用程序,它有一个自定义列表视图,用于几个元素,这些元素有一个播放按钮来播放相应的媒体。就其本身而言,这很有效。 我决定,能够停止播放剪辑可能是个好主意,所以我在每个listview项目中添加了一个Stop按钮,但是在GONE正在播放之前将其设置为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);
}
});
说明
只要用户只专注于一个剪辑,这样就可以了。 Play按钮被Stop按钮取代,Stop按钮停止剪辑,或者如果你让剪辑用完,按钮也会切换回来。
问题:
如果用户决定通过点击列表中第二个元素的播放来中断播放,则第一个元素将停留在停止按钮上。由于Stop按钮只执行mp.release(),因此第一个元素的停止按钮现在能够停止播放第二个剪辑。 由于这一切都发生在列表视图中,当单击第二个项目时,我无法再访问第一个项目以再次替换按钮。 我找了一种方法来捕获中断(很像mp.setOnCompletionListener查找成功完成)并重置按钮,但到目前为止,我无法想出任何东西。 我实际上喜欢这样的事实:通过首先放置发布,然后创建一个新的媒体播放器然后启动它,用户只需按下另一个剪辑上的播放即可快速切换剪辑。我只是希望一旦新剪辑开始,原始剪辑上的“停止”按钮就会消失。
问题:
答案 0 :(得分:0)
如果您制作处理MediaPlayer的服务,您可以向其发送意图以控制播放/停止。在播放意图中,您可以包含一个PendingIntent,当当前播放的媒体因任何原因因完成或者其他某个剪辑被启动而停止时,该服务会发送回UI。
PendingIntent由列表项的onClick回调生成,因此它会自动调用正确的列表项回调并重置按钮。
答案 1 :(得分:0)
我认为setOnCompletionListener可能是一个好主意,但是你应该调用stop()方法而不是release()。如果它没有帮助你也可以跳过流到最后(seekTo(getDuration())方法)。这肯定会调用onCompletionListener
我认为您不需要使用ImageButton。添加到适配器“已选择”字段,您可以在其中记住上次选择项目的编号。在getView()中,您可以检查某些行是“已选中”并使适当的图像(播放/暂停)可见。然后将OnItemClickListener接口添加到Adapter类。当调用onItemClick方法时,检查是否选择了相同的(然后暂停流并使“selected”字段为null)或new(然后播放流并将新行号分配给“selected”字段)行。进行notifyDataSetChanged()方法调用,以在列表视图中生成具有正确图像的新行。