Java android recyclerview viewholder Mediaplayer处理点击问题

Java android recyclerview viewholder Mediaplayer处理点击问题,java,android,android-studio,android-mediaplayer,realmrecyclerviewadapter,Java,Android,Android Studio,Android Mediaplayer,Realmrecyclerviewadapter,我通过单击项目视图播放音频文件MP3,上一个文件自动停止,但问题是,在单击recyclerview的第三个项目后,第一个项目在其单击时不播放声音,并且在列表的其他一些单击中也发生了相同的问题。我添加了完整的适配器类 public class RingToneAdapter extends RecyclerView.Adapter<RingToneAdapter.RingToneViewHolder> { //removed declared varaible for t

我通过单击项目视图播放音频文件MP3,上一个文件自动停止,但问题是,在单击recyclerview的第三个项目后,第一个项目在其单击时不播放声音,并且在列表的其他一些单击中也发生了相同的问题。我添加了完整的适配器类

public class RingToneAdapter extends RecyclerView.Adapter<RingToneAdapter.RingToneViewHolder> {
       //removed declared varaible for the sake of post to edit
       static final int[] resID = {R.raw.a48, R.raw.funny_hen};

        public RingToneAdapter(Context rcntx, List<RingTone_Items> ringtonelist) {
            this.rcntx = rcntx;
            this.ringtonelist = ringtonelist;
        }

        @NonNull
        @Override
        public RingToneViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            view = LayoutInflater.from(rcntx).inflate(R.layout.ringtone_values, viewGroup, false);
            RingToneViewHolder ringToneViewHolder = new RingToneViewHolder(view);
            return ringToneViewHolder;
        }

        //playing sounds on recycler view

        @Override
        public void onBindViewHolder(@NonNull final RingToneViewHolder ringToneViewHolder, final int i) {
            final RingTone_Items ringTone_items = ringtonelist.get(i);
            ringToneViewHolder.rtv.setText(ringTone_items.getRintonetv());
            if (mSelectedItem == i) { 
                 ringToneViewHolder.iconplay.setImageResource(R.drawable.ic_pause_black_24dp);
            } else {
                ringToneViewHolder.iconplay.setImageResource(R.drawable.ic_play_arrow_black_24dp); 
            }

            ringToneViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {              
                    if (mp != null && mp.isPlaying()) {
                        mp.stop();
                        mp.reset();
                        mp = null;
                        ringToneViewHolder.iconplay.setImageResource(R.drawable.ic_play_arrow_black_24dp);

                    }
                    //Intent it = new Intent(rcntx, ViewPager_Data.class);
                    Intent it = new Intent(rcntx, AndroidViewPagerExample.class);
                    it.putExtra("POS",i);
                    it.putExtra("name",ringTone_items.getRintonetv());

                    rcntx.startActivity(it);
                }
            });
            ringToneViewHolder.iconplay.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   if (mSelectedItem == i) {
                        mSelectedItem = -1;
                       oldpossssssss = i;
                    } else {
                        mSelectedItem = i;
                    }
                    notifyDataSetChanged();
                    if (mp != null && mp.isPlaying()) {
                        mp.stop();
                        mp.reset();
                        mp = null;

                        if (oldpossssssss == i) {
                        } else {
                           mp = new MediaPlayer();
                           mp = MediaPlayer.create(rcntx, resID[i]);
                           mp.start();
                       }
                  } else {
                        mp = new MediaPlayer();
                        mp = MediaPlayer.create(rcntx, resID[i]);
                        mp.start();
                    }
                }
            });
        }

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

        class RingToneViewHolder extends RecyclerView.ViewHolder {
            private TextView rtv, hello, close;
            private ImageView iconplay;


            public RingToneViewHolder(@NonNull View itemView) {
                super(itemView);
                rtv = itemView.findViewById(R.id.ringtitle);
                iconplay = itemView.findViewById(R.id.playicon);

            }

        }

如何根据相应的“播放媒体文件”来顺利地管理此操作。我哪里做错了,请帮助我,谢谢。

我建议您在您的视盘中使用单音媒体播放器。首先,使用多个准备好的媒体播放器的内存效率不是很高。其次,它将允许您解决在后台播放声音的问题,因为一个mediaPlayer一次只能播放一个音频

ringToneViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {              
                    if (mp != null && mp.isPlaying()) {
                        mp.stop();
                        mp.reset();
                        mp.release();
                        mp = null;
                        ringToneViewHolder.iconplay.setImageResource(R.drawable.ic_play_arrow_black_24dp);

                    }
                    //Intent it = new Intent(rcntx, ViewPager_Data.class);
                    Intent it = new Intent(rcntx, AndroidViewPagerExample.class);
                    it.putExtra("POS",i);
                    it.putExtra("name",ringTone_items.getRintonetv());

                    rcntx.startActivity(it);
                }
            });    
ringToneViewHolder.iconplay.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                       if (mSelectedItem == i) {
                           oldpossssssss = i;
                        } else {
                            mSelectedItem = i;
                        }
                        notifyDataSetChanged();
                            if (oldpossssssss == i) {
                              if(mp != null){
                                 if(mp.mp.isPlaying()){
                                    mp.pause();
                                  } else{
                                    mp.start();
                                  }
                              }
                            } else {
                               createMediaPlayer(i)
                           }
                    }
                });
创建MediaPlayer时使用此方法

private void createMediaPlayer(int i)
{
    if (mp!=null)
    {
        if(mp.isPlaying())
        {
            mp.stop();
            mp.reset();
            mp.release();
            mp=null;
        }

    }
    mp = new MediaPlayer();
    mp = MediaPlayer.create(rcntx, resID[i]);
    mp.start();
}

可能是它的工作。

你能发布整个适配器代码吗?试图编辑整个适配器代码,但它给我错误…第一次我上传到那里,所以这些问题发生了。没有问题解决错误,并按照说明根据错误发布,否则没有人能理解你的问题并查看下面给出的答案还有。@TanveerMunir现在我已经编辑了完整的适配器类。好的,我必须看一下。对不起,先生,我不明白你想说什么……我是初学者……所以我想这就是为什么我不能understand@FaizaZubair他试图说,在新MediaPlayer的一个对象上创建使用对它的操作停止并播放,因为它没有内存效率。