【问题标题】:How can audio player play audio in recycler view?音频播放器如何在回收站视图中播放音频?
【发布时间】:2021-02-18 06:06:09
【问题描述】:

我的音频播放器无法在回收站视图中播放音频请帮帮我我从上周卡住了我想在回收站视图中播放音频

【问题讨论】:

  • 能否详细说明
  • @NagoorBhasha 我想完全像截图中提到的那样
  • 我建议对所有项目使用单个媒体播放器,根据项目点击更改媒体播放器的来源

标签: android-studio android-mediaplayer audio-player android-audiomanager android-audiorecord


【解决方案1】:

这是我的 recyclerView 适配器,你必须把你的 arraylist 放在这个适配器中

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.AudioItemsViewHolder> {

static MediaPlayer mediaPlayer;
Activity activity;


private final ArrayList<GroupItems> audioItems;//change it() to your items
private int currentPlayingPosition;
private final SeekBarUpdater seekBarUpdater;
private AudioItemsViewHolder playingHolder;
this.activity = activity;

@Override
public AudioItemsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  //put YourItemsLayout;
    return new AudioItemsViewHolder(LayoutInflater.from(parent.getContext()).inflate(YourItemsLayout, parent, false));
}

@Override
public void onBindViewHolder(AudioItemsViewHolder holder, int position) {
if (position == currentPlayingPosition) {
        playingHolder = holder;
        updatePlayingView();
    } else {
        updateNonPlayingView(holder);
    }
}
   private void updateNonPlayingView(AudioItemsViewHolder holder) {
    holder.sbProgress.removeCallbacks(seekBarUpdater);
    holder.sbProgress.setEnabled(false);
    holder.sbProgress.setProgress(0);
    holder.ivPlayPause.setImageResource(R.drawable.ic_baseline_play_arrow_24);
}

private void updatePlayingView() {
    playingHolder.sbProgress.setMax(mediaPlayer.getDuration());
    playingHolder.sbProgress.setProgress(mediaPlayer.getCurrentPosition());
    playingHolder.sbProgress.setEnabled(true);
    if (mediaPlayer.isPlaying()) {
        playingHolder.sbProgress.postDelayed(seekBarUpdater, 100);
        playingHolder.ivPlayPause.setImageResource(R.drawable.ic_pause);
    } else {
        playingHolder.sbProgress.removeCallbacks(seekBarUpdater);
        playingHolder.ivPlayPause.setImageResource(R.drawable.ic_baseline_play_arrow_24);
    }
}
  private class SeekBarUpdater implements Runnable {
    @Override
    public void run() {
        if (null != playingHolder && null != mediaPlayer) {
            playingHolder.sbProgress.setProgress(mediaPlayer.getCurrentPosition());
            playingHolder.sbProgress.postDelayed(this, 100);
        }
    }
}

@Override
public int getItemCount() {
    return audioItems.size();
}
 
    class AudioItemsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, SeekBar.OnSeekBarChangeListener {
    SeekBar sbProgress;
    ImageView ivPlayPause;
    AudioItemsViewHolder(View itemView) {
        super(itemView);
     ivPlayPause = itemView.findViewById(R.id.sound_btn);
        ivPlayPause.setOnClickListener(this);
        sbProgress = itemView.findViewById(R.id.seekBar);
        sbProgress.setOnSeekBarChangeListener(this);
    }
    @Override
    public void onClick(View v) {


        switch (v.getId()) {
            case R.id.seekBar:
                break;

            case R.id.sound_btn: {
                if (getAdapterPosition() == currentPlayingPosition) {
                    if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                        mediaPlayer.pause();
                    } else {
                        if (mediaPlayer != null)
                            mediaPlayer.start();
                    }
                } else {
                    currentPlayingPosition = getAdapterPosition();
                    if (mediaPlayer != null) {
                        if (null != playingHolder) {
                            updateNonPlayingView(playingHolder);
                        }
                        mediaPlayer.release();
                    }
                    playingHolder = this;



                   
                        PlaySound(YOUR AUDIO FILE);//put your audio file


                }
                if (mediaPlayer != null)
                    updatePlayingView();
            }
            break;
    }


    }


     @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (fromUser) {
            mediaPlayer.seekTo(progress);
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
    }
}
 private void PlaySound(File filesound) {

    mediaPlayer = MediaPlayer.create(activity, Uri.parse(String.valueOf(filesound)));

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            releaseMediaPlayer();
        }
    });
    mediaPlayer.start();
}
    private void releaseMediaPlayer() {
    if (null != playingHolder) {
        updateNonPlayingView(playingHolder);
    }
    if (outputFile.exists())
        outputFile.delete();

    mediaPlayer.release();
    mediaPlayer = null;
    currentPlayingPosition = -1;
}
}

我的输出:

【讨论】:

    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2022-08-23
    相关资源
    最近更新 更多