2014-11-16 1 views
0

아래 목록은 트랙 목록을 표시하는 목록보기 어댑터의 코드입니다. 각 목록 항목에는 재생 및 중지 아이콘이있어서 재생 및 중지 할 수 있습니다. 그 트랙은 내가 재생 버튼을 클릭 할 때만 처음으로 재생됩니다. 그 후에 정지 버튼을 클릭하여 재생을 멈추고 재생할 수없는 트랙을 재생하려고하면됩니다. 토스트 메시지를 통해 그 홀더를 발견했습니다. img1.setOnClickListener() 메서드가 호출되지만 onPrepared() 메서드는 재생 단추를 두 번째로 클릭 할 때 호출되지 않습니다. onPrepared() 메서드가 처음 호출 된 이유는 트랙이 처음 재생 된 이유 시간 ..MediaPlayer 클래스를 사용하여 오디오 재생 (트랙은 처음에만 재생 됨)

mMediaPlayer=new MediaPlayer();을 onClick() 메서드안에 넣으면위의 문제는 holder.img1 플레이 아이콘을하고 holder.img2 정지 아이콘입니다 .. 코드는 여기에 .. 를 해결됩니까하지만 여러 플레이 버튼을 클릭하면 내가 원하지 않는 동시에 여러 트랙을 재생됩니다

당신이 오류가 발생한다 prepareAsync 여러 번 호출하는 것처럼

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; 
    } 

} 

사운드 클라우드는

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 = 새 MediaPlayer(); }' –

+0

onClick 외부에서'setOnPreparedListener'를 움직이려고 시도 했습니까? –

+0

ur 첫번째 코멘트는 부분적으로 문제를 해결하는 데 도움이되었습니다. 트랙을 연주하고 다른 트랙을 연주하려고하면 이전 트랙이 중단되고 클릭 한 새로운 트랙이 재생되기 시작합니다. 좋아요. 그렇다면 나는 멈춤 버튼을 클릭하여 현재 압정을 멈추고 연주되지 않는 어떤 트랙을 연주하려고 시도한다. –

답변

2

보인다. 당신의 온 클릭 리스너에서

는 먼저 호출해야합니다입니다 :

mMediaPlayer.reset(); 
+0

고마워요! 내가 트랙을 연주하고 이전 트랙을 멈추지 않고 다른 트랙을 연주하려고하면 이전 트랙이 자동으로 중지되고 새 트랙이 재생되기 시작합니다. 문제는 없습니다.하지만 이전 트랙에는 일시 중지 버튼이 계속 표시됩니다. 아이콘은 현재 아이콘이 재생되지 않기 때문에 아이콘을 변경해야합니다. 글래드라면 나를 도와 줄 수 있습니다. –

+1

@ user3753273 마지막으로 시작한 노래를 저장해야하며 onClick 리스너가 호출 될 때마다 마지막 노래 (있는 경우)를 중지하십시오. – Simas

+0

내가 마지막으로 시작한 노래의 위치를 ​​차지하고 그에 따라 재생 중지 아이콘을 변경하는 Soundcloud 클래스의 getter setter 메서드를 만들어야합니다. –