2014-11-16 148 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方法,它包含上次启动的歌曲的位置,然后相应地更改播放停止图标 –