簡體   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