2014-11-16 210 views
0

下面是顯示音軌列表的listview適配器的代碼。每個列表項都有播放和停止圖標以播放和停止播放。我遇到的問題當我點擊播放按鈕時,該曲目只能在第一次播放。之後,如果我通過點擊停止按鈕停止播放,嘗試播放任何曲目,它都不會播放。通過吐司消息,我發現了該播放器。 img1.setOnClickListener()方法確實被調用,但onPrepared()方法不會在第二次或之後單擊播放按鈕時被調用。但是,第一次調用onPreredred()方法時,爲什麼第一次播放曲目時時間..使用MediaPlayer類播放音頻(僅在第一次播放音軌時)

如果我把mMediaPlayer=new MediaPlayer();裏面的onClick()方法holder.img1.setOnClickListener上述問題確實得到解決,但然後單擊多播放按鈕開始播放在同一時間多個軌道,我不想.. 這裏是代碼.. holder.img1是播放圖標和holder.img2是停止圖標

SoundCloudAdapter

public class SoundCloudAdapter extends BaseAdapter{ 

    private MediaPlayer mMediaPlayer; 
    private Context context; 
    private ArrayList<SoundCloud> soundcloudList; 

    public SoundCloudAdapter(Context context, ArrayList<SoundCloud> soundcloudList) 
    { 
     this.context=context; 
     this.soundcloudList = soundcloudList; 
     mMediaPlayer=new MediaPlayer(); 
    } 

    @Override 
    public long getItemId(int position) 
    { 
     return position; 
    } 

    @Override 
    public int getCount() 
    { 
     return soundcloudList.size(); 
    } 

    @Override 
    public Object getItem(int position) 
    { 
     return soundcloudList.get(position); 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) 
    { 
     final ViewHolder holder; 

     if (convertView == null){ 
      holder = new ViewHolder(); 
      convertView = LayoutInflater.from(context).inflate(R.layout.soundcloud_item, null); 
      holder.textview = (TextView) convertView.findViewById(R.id.title); 
      holder.textview2 = (TextView) convertView.findViewById(R.id.id); 
      holder.textview3 = (TextView) convertView.findViewById(R.id.download); 
      // holder.btn = (Button) convertView.findViewById(R.id.button); 
      holder.img1 = (ImageView) convertView.findViewById(R.id.play2); 
      holder.img2 = (ImageView) convertView.findViewById(R.id.pause); 
      convertView.setTag(holder); 
     }else{ 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.textview.setText(soundcloudList.get(position).getTitle()); 
     holder.textview2.setText(soundcloudList.get(position).getId()); 
     holder.textview3.setText("Play Count : "+soundcloudList.get(position).getDownload()); 
     if(soundcloudList.get(position).getPlaying()) 
     { 

      holder.img1.setVisibility(View.GONE); 
      holder.img2.setVisibility(View.VISIBLE); 
     } 
     else 
     { 

      holder.img1.setVisibility(View.VISIBLE); 
      holder.img2.setVisibility(View.GONE); 
     } 
     holder.img1.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(final View v) 
      { 

       Toast.makeText(context,"img1",Toast.LENGTH_LONG).show(); 
       soundcloudList.get(position).setPlaying(true); 
       try 
       { 
        holder.img1.setVisibility(View.INVISIBLE); 
        holder.img2.setVisibility(View.VISIBLE); 

        if(mMediaPlayer.isPlaying()) 
        { 
         Toast.makeText(context,"isplaying",Toast.LENGTH_LONG).show(); 
         mMediaPlayer.pause(); 
        } 

        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
        mMediaPlayer.setDataSource("http://api.soundcloud.com/tracks/" + soundcloudList.get(position).getId() + "/stream?client_id=xyz"); 
        mMediaPlayer.prepareAsync(); 
        mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() 
        { 
         @Override 
         public void onPrepared(MediaPlayer mp) 
         { 
          Toast.makeText(context,"prepatre",Toast.LENGTH_LONG).show(); 
          mp.start(); 

         } 
        }); 
        mMediaPlayer.setOnCompletionListener(
          new MediaPlayer.OnCompletionListener() 
          { 
           @Override 
           public void onCompletion(MediaPlayer mp) 
           { 
            soundcloudList.get(position).setPlaying(false); 
            holder.img1.setVisibility(View.VISIBLE); 
            holder.img2.setVisibility(View.INVISIBLE); 

           } 
          }); 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 

      } 

     }); 
     holder.img2.setOnClickListener(new View.OnClickListener() 
     { 

      @Override 
      public void onClick(final View v) 
      { 
       Toast.makeText(context,"stop",Toast.LENGTH_LONG).show();; 
       soundcloudList.get(position).setPlaying(false); 


       holder.img1.setVisibility(View.VISIBLE); 
       holder.img2.setVisibility(View.INVISIBLE); 


       mMediaPlayer.pause(); 


      } 

     }); 

     return convertView; 

    } 

    static class ViewHolder 
    { 
     public TextView textview; 
     public TextView textview2; 
     public TextView textview3; 
     public ImageView img1; 
     public ImageView img2; 
     public Button btn; 
    } 

} 

的SoundCloud

public class SoundCloud { 
    private String title; 
    private String kind; 
    private String id; 
    private String duration; 
    private String download; 
    private boolean isPlaying=false; 
    public SoundCloud() 
    { 
     super(); 


    } 
    public String getTitle() 
    { 
     return title; 
    } 

    public void setTitle(String title) 
    { 
     this.title = title; 
    } 
    public String getKind() 
    { 
     return kind; 
    } 

    public void setKind(String kind) 
    { 
     this.kind = kind; 
    } 
    public String getId() 
    { 
     return id; 
    } 

    public void setId(String id) 
    { 
     this.id = id; 
    } 
    public String getDuration() 
    { 
     return duration; 
    } 

    public void setDuration(String duration) 
    { 
     this.duration = duration; 
    } 

    public String getDownload() 
    { 
     return download; 
    } 

    public void setDownload(String download) 
    { 
     this.download = download; 
    } 
    public Boolean getPlaying() 
    { 
     return isPlaying; 
    } 

    public void setPlaying(Boolean isPlaying) 
    { 
     this.isPlaying = isPlaying; 
    } 

} 
+1

只是周圍的工作:'如果(mMediaPlayer.isPlaying()){ Toast.makeText(背景下, 「IsPlaying模塊」,吐司。 LENGTH_LONG).show(); mMediaPlayer.pause(); mMediaPlayer = new MediaPlayer(); }' –

+0

嘗試在onClick之外移動'setOnPreparedListener'然後? –

+0

你的第一條評論幫助我解決了部分問題..如果我正在播放曲目,然後嘗試播放另一首曲目,那麼上一首曲目會停止,並且我單擊的新曲目將開始播放。這很好..但是如果我通過點擊停止按鈕來停止當前的粘性,並嘗試播放它沒有播放的任何曲目。 –

回答

2

好像你在呼喚prepareAsync多次,這應該拋出一個錯誤。

在你的onClick監聽器第一個你應該叫的是:

mMediaPlayer.reset(); 
+0

謝謝你!如果我正在播放曲目,然後嘗試播放另一首曲目而不停止上一首曲目,那麼上一首曲目會自動停止播放,並且新曲目將開始播放。這很好..但唯一的問題是上一首曲目仍顯示暫停按鈕圖標,而它應該改變爲播放圖標,因爲目前它不播放..很好,如果你能幫助我的話。 –

+1

@ user3753273您需要保存上次啓動的歌曲,並在每次調用onClick監聽器時停止最後一首歌曲(如果存在)。 – Simas

+0

我應該在Soundcloud類中創建一個getter setter方法,它包含上次啓動的歌曲的位置,然後相應地更改播放停止圖標 –