android recyclerview viewholder Mediaplayer处理水龙头问题

时间:2019-02-12 12:12:53

标签: java android android-studio android-mediaplayer realmrecyclerviewadapter

我正在通过单击“项目”视图来播放音频文件(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);

            }

        }

如何通过相应地单击播放媒体文件来顺利地进行管理。我在哪里做错了,请帮助我。

2 个答案:

答案 0 :(得分:1)

我建议您在viewHolders中使用单调媒体播放器。首先,使用多个准备好的mediaPlayers的内存效率不是很高。其次,它可以解决背景播放声音的问题,因为一个mediaPlayer一次只能播放一种音频。

答案 1 :(得分:0)

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

可能是它的工作。