繁体   English   中英

android recyclerview viewholder Mediaplayer处理水龙头问题

[英]android recyclerview viewholder Mediaplayer handling taps problem

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

            }

        }

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

我建议您在viewHolders中使用单调媒体播放器。 首先,使用多个准备好的mediaPlayers的内存效率不是很高。 其次,由于一个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();
}

可能是它的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM