2013-08-02 63 views
1

嗯,我有一个带声音的ListView。当我点击其中的一首歌曲时,它开始播放该歌曲,但当我点击其他歌曲时,它仍在播放。我想要做的是当我按下另一个时,停止发出声音。我谷歌,找到解决方案完全相同的问题,但它不会为我工作。我得到错误,它说:“MediaPlayer类型中的方法setDataSource(String)不适用于参数(int)”。我只是不知道如何得到具体的位置,哪个项目行被点击。这是我在onListItemClick()方法现在有:onListItemClick()开始/停止歌曲

@Override 
    public void onListItemClick(ListView parent, View v, int position, long id) { 
     Minions s = (Minions) mSounds.get(position); 
     MediaPlayer mPlayer; 

     final boolean isPlaying = false; 

     if(!isPlaying){ 
      mPlayer = new MediaPlayer(); 
      mPlayer.setDataSource(s.getSoundResourceId()); 
      mPlayer.prepare(); 
      mPlayer.start(); 
      isPlaying = true; 

     }else{ 

      isPlaying = false; 
      mPlayer.stop(); 
      mPlayer.reset(); 
      mPlayer.setDataSource(s.getSoundResourceId()); 
      mPlayer.prepare(); 
      mPlayer.start(); 
      isPlaying = true; 

     } 

     mPlayer.setOnCompletionListener(new OnCompletionListener() { 

      public void onCompletion(MediaPlayer mPlayer) { 
       mPlayer.release(); 
       isPlaying = false; 
      } 

     }); 

    } 
+0

以获得职位使用“职位” – Lele

回答

2

这是我会怎么做,你的情况:

代替:

 mediaPlayer= new MediaPlayer(); 
     mediaPlayer.setDataSource(s.getSoundResourceId()); 

使用:

mediaPlayer=MediaPlayer.create(context,R.raw.blabla); 

这里你不需要prepare

private MediaPlayer mPlayer; 

.... 

@Override 
public void onListItemClick(ListView parent, View v, int position, long id) { 


    final boolean isPlaying = false; 

    if(!isPlaying){ 
     mediaPlayer=MediaPlayer.create(context,R.raw.blabla); 

     mPlayer.start(); 
     isPlaying = true; 

    }else{ 

     isPlaying = false; 
     mPlayer.stop(); 
     mPlayer.reset(); 
     mediaPlayer=MediaPlayer.create(context,R.raw.blabla);   
     mPlayer.start(); 
     isPlaying = true;    

    } 

    mPlayer.setOnCompletionListener(new OnCompletionListener() { 

     public void onCompletion(MediaPlayer mPlayer) { 
      mPlayer.release(); 
      isPlaying = false; 
     } 

    }); 

} 
+0

它的作用就像一个魅力。谢谢 :) –

1

尝试setDataSource(""+s.getSoundResourceId());

,而不是setDataSource(s.getSoundResourceId());

PS。也初始化mPlayer

MediaPlayer mPlayer=new MediaPlayer();而不是MediaPlayer mPlayer;

,并从你的病情是否删除此mPlayer = new MediaPlayer();

+0

当我这样做时,它会显示“未处理的异常类型IOException”并提供使用try/catch进行环绕。当我围绕它(几次),我得到另一个错误:“局部变量mPlayer可能尚未初始化”,因此它初始化为空和应用程序崩溃。 –

+0

@Danger所以你必须初始化mPlayer! –

+0

@丹格见我更新的答案! –