Android Recyclerview MediaPlayer上一个项目声音停止,单击新项目后释放 [英] Android Recyclerview MediaPlayer previous Item sound stop, release after new one is clicked

查看:95
本文介绍了Android Recyclerview MediaPlayer上一个项目声音停止,单击新项目后释放的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序中,我有recyclerview物品,并且每个物品在我单击时都会播放声音. 问题是,当我单击几个项目时,它们都在同一时间播放声音,直到它们完成为止. 假设我单击了10个项目,所有10个播放声音同时出现,并且一段时间后应用程序崩溃了,并且出现以下错误: E/MediaPlayer:错误(1,-19). 通过使用以下代码实现自动发布,我避免了应用崩溃:

In my app i have recyclerview items, and each item play sound when i click it. Problem is that when i click few items, they all play sounds in the same time until they finish. Lets say i click 10 items, all 10 play sounds in the same time and after some time app get crashed and i get this error: E/MediaPlayer: error (1, -19). I avoid app crashing by implementing automatic release with this code:

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

                        }
                    });

但这不是我想要的,同时听到很少的声音很烦人.我想要的是在单击新声音时停止以前的声音,我试图使Mediaplayer停止并释放,但没有成功.

But that's not what i want, it is annoying to hear few sounds in the same time. What i want is to stop previous sound when i click new one, i try to implent mediaplayer stop and release, but without success.

这是Google Play中的应用,因此您可以自己检查: https://play.google.com/store/apps/details?id=org.pero.androidd.animalSoundsQuiz

This is the app in google play so you can check by yourself: https://play.google.com/store/apps/details?id=org.pero.androidd.animalSoundsQuiz

这是我播放声音的适配器代码.在这段代码中,有一部分MediaPlayer.OnCompletionListener(),在声音播放完后,我会释放声音,以免 E/MediaPlayer:错误(1,-19)错误,但这不是我想要的应用程序.我想在单击新声音后停止上一个声音.

Here is my Adapter code where i play sounds. In this code there is part MediaPlayer.OnCompletionListener() where i release sound after sound finish to aviod E/MediaPlayer: error (1, -19) error, but that is not what i want in my app. I want to stop previous sound after i click new one.

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


}

编辑编辑编辑编辑

我找到了解决方案,我不知道这是最聪明的方法,但是对我来说很好:

I find solution, i do not know is this the smartest way to do it but it works for me fine:

我所做的是我使静态媒体播放器可变,因此我可以从ViewHolder访问媒体播放器并在单击新声音时停止播放先前的声音.希望对您有所帮助.

What i done is that i made static media player variable and this way i can access to media player from ViewHolder and stop previous sound when i click new one. Hope it helps.

这是完整的代码:

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


}

推荐答案

您首先必须检查是否已经在播放声音,如果有,则在用户决定开始新声音时应停止播放.

You first have to check if there is a sound that is already playing and if there is, you should stop it when the user decides to start a new sound.

itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaplayer.isPlaying ()) {
                    if (mediaplayer != null){
                        mediaplayer.stop ();
                    }
                } else {
                    if (mediaplayer != null) {
                        mediaplayer.start ();
                    }
                }
            }
        });

setOnCompletionListner中,如果用户听了整个声音片段,则释放声音.

In setOnCompletionListner you release the sound if the user listens to the whole sound clip.

        mediaplayer. setOnCompletionListner (new MediaPlayer.OnCompletionListner () {
            public void OnCompletion (MediaPlayer mediaplayer) {
                mediaplayer.release ();
            }
        });

这篇关于Android Recyclerview MediaPlayer上一个项目声音停止,单击新项目后释放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆