Android Recyclerview MediaPlayer item anterior som parar, liberar após um novo é clicado

No meu aplicativo, tenho itens de visualização de reciclagem e cada item é reproduzido quando clico nele. O problema é que, quando clico em alguns itens, todos reproduzem sons ao mesmo tempo até terminar. Vamos dizer que clico em 10 itens, todos os 10 reproduzem sons ao mesmo tempo e depois de algum tempo o aplicativo falha e recebo este erro:E / MediaPlayer: erro (1, -19). Evito travar o aplicativo implementando a liberação automática com este código:

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            mediaPlayer.release();

                        }
                    });

Mas não é isso que eu quero, é chato ouvir alguns sons ao mesmo tempo. O que eu quero é parar o som anterior quando clico em um novo, tento implantar o mediaplayer parar e liberar, mas sem sucesso.

Este é o aplicativo no Google Play para que você possa verificar por si mesmo:https://play.google.com/store/apps/details?id=org.pero.androidd.animalSoundsQuiz

Aqui está o código do meu adaptador, onde reproduzo sons. Neste código, há a parte MediaPlayer.OnCompletionListener () em que libero o som após o término do som para aviodE / MediaPlayer: erro (1, -19) erro, mas não é isso que eu quero no meu aplicativo. Quero parar o som anterior depois de clicar em novo.

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 com.pero.androidd.animalsoundsforchildren.R;

import java.util.List;


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

    private List<Zivotinje> mZivotinje;


    @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
        //Dohvacamo context svakog views
        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);


            //Handdaling clicks
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                                        
                    final MediaPlayer mediaPlayer = MediaPlayer.create(v.getContext(), mItem.getmSound());
                    mediaPlayer.start();

                    
                    //releace media player after sound finish
                    // BUT I DO NOT WANT TIS, I WANT TO STOP PREVIOUS SOUND WHEN I CLICK NEW ONE
                    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            mediaPlayer.release();

                        }
                    });
                }
            });

        }


    }


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


}

EDIT EDIT EDIT EDIT EDIT EDIT EDIT:

Acho a solução, não sei se é a maneira mais inteligente de fazê-lo, mas funciona bem para mim:

O que fiz é que tornei o media player estático variável e, dessa forma, posso acessar o media player do ViewHolder e interromper o som anterior quando clico em um novo. Espero que ajude.

aqui está o código inteiro:

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

    private static MediaPlayer mediaPlayer; //THIS IS THE CHANGE I DONE

    @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);


//handaling clicks 
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {


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


                    mediaPlayer = MediaPlayer.create(v.getContext(), mItem.getmSound());
                    mediaPlayer.start();

                }
            });

        }


    }

    private List<Zivotinje> mZivotinje;

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


}

questionAnswers(1)

yourAnswerToTheQuestion