2016-05-31 18 views
0

解決策を見つけようとしましたが見つかりませんでした。Android新しい再生音がRecycleviewで再生されたときにメディアプレーヤーを停止する方法

私の問題は、私はリサイクルビューにたくさんのアイテムがあることです。各アイテムには画像があり、その画像をクリックするとその画像の音声が鳴ります。 問題は私が新しい音を開始するとき、前の音が止まらず、音が終了するまでその音が持続することです。私は15をクリックした後、20は、アプリがクラッシュします聞こえると私は、このエラーメッセージが表示されます。

E/MediaPlayerの:エラー(1、-19)

はどういうわけか、私は前の音のリリースと停止を実装する必要がとき、私新しいものをクリックしてください。私は解決策を見つけることを試みるが、私はrecycleviewのためにそれを見つけることができなかった。ここで

は私のアダプターのコードは次のとおりです。

import android.content.Context; 
 
import android.media.MediaPlayer; 
 
import android.support.v7.widget.RecyclerView; 
 
import android.view.LayoutInflater; 
 
import android.view.View; 
 
import android.view.ViewGroup; 
 
import android.widget.ImageView; 
 
import android.widget.TextView; 
 

 
import com.bumptech.glide.Glide; 
 

 
import java.util.List; 
 

 

 
public class ZivotinjeAdapter extends RecyclerView.Adapter<ZivotinjeAdapter.ViewHolder> { 
 

 
    @Override 
 
    public ZivotinjeAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
 
     Context context = parent.getContext(); 
 
     LayoutInflater inflater = LayoutInflater.from(context); 
 

 
     // Inflate the custom layout 
 
     View contactView = inflater.inflate(R.layout.item_zivotinje, parent, false); 
 

 
     // Return a new holder instance 
 
     ViewHolder viewHolder = new ViewHolder(contactView); 
 
     return viewHolder; 
 
    } 
 

 
    @Override 
 
    public void onBindViewHolder(ZivotinjeAdapter.ViewHolder viewHolder, int position) { 
 

 

 
     Zivotinje zivotinjeIme = mZivotinje.get(position); 
 

 
     // Set item views based on the data model 
 
     TextView textView = viewHolder.nameTextView; 
 
     textView.setText(zivotinjeIme.getmAnimal_name()); 
 

 
     //THIS IS WHERE I HANDALE IMAGE VIEW. Using glide for images 
 
     ImageView slika_source = viewHolder.imageView; 
 
     Glide.with(slika_source.getContext()) 
 
       .load((Integer) zivotinjeIme.getmAnimal_slika()) 
 
       .into(slika_source); 
 

 

 

 
     viewHolder.setItem(mZivotinje.get(position)); 
 

 
    } 
 

 

 
    @Override 
 
    public int getItemCount() { 
 
     return mZivotinje.size(); 
 
    } 
 

 
    public static class ViewHolder extends RecyclerView.ViewHolder { 
 

 
     public ImageView imageView; 
 
     public TextView nameTextView; 
 
     private Zivotinje mItem; 
 

 

 

 
     public void setItem(Zivotinje item) { 
 
      this.mItem = item; 
 
     } 
 

 

 

 
     public ViewHolder(final View itemView) { 
 
      super(itemView); 
 

 
      nameTextView = (TextView) itemView.findViewById(R.id.zivotinjaIme_id); 
 
      imageView = (ImageView) itemView.findViewById(R.id.slika_id); 
 

 
      
 
//this is click event for each item and here i play sound 
 
      itemView.setOnClickListener(new View.OnClickListener() { 
 
       @Override 
 
       public void onClick(View v) { 
 
        
 
        MediaPlayer mediaPlayer = MediaPlayer.create(v.getContext(), mItem.getmSound()); 
 
        mediaPlayer.start(); 
 

 
       } 
 
      }); 
 

 
     } 
 

 

 
    } 
 

 
    private List<Zivotinje> mZivotinje; 
 

 
    public ZivotinjeAdapter(List<Zivotinje> animals) { 
 
     mZivotinje = animals; 
 
    } 
 

 

 

 

 
}

答えて

0

はこれを追加:

@Override 
public void onClick(View v) { 
stopPlaying(); <-------    
MediaPlayer mediaPlayer = MediaPlayer.create(v.getContext(),mItem.getmSound()); 
mediaPlayer.start();} 

と、この:

....... 

public ZivotinjeAdapter(List<Zivotinje> animals) { 
    mZivotinje = animals; 
} 

private void stopPlaying() { 

    if(mediaPlayer != null && mediaPlayer.isPlaying()) 
    { 
     mediaPlayer.stop(); 
     mediaPlayer.reset(); 
     mediaPlayer.release(); 
     mediaPlayer = null; 
    } 
} 
+0

それは私がすることはできません、すべての赤ですがコールストップクリックからpPlayingメソッド。 – beginner

+0

編集を試してください... – Srdan

+0

まだメソッドstopPlayingに到達できません。 ; 場合(!MediaPlayerの= nullを&& mediaPlayer.isPlaying()){ mediaPlayer.stop():それは非静的metodのstopPlayingを()その後、ちょうどこのようなあなたのMediaPlayerを囲む静的コンテキスト – beginner

関連する問題