使用媒体播放器播放音频时 Recyclerview 滚动

Recyclerview scrolling when play audio with mediaplayer

我正在开发一个聊天应用程序,这个应用程序可以发送语音聊天 声音播放正确,但问题 当我点击播放按钮时,recyclerview 滚动到顶部:

 private void playVoice(Message message, final ImageView playBtn, final SeekBar seekBar, final CfTextView timer) {
    isCurrentMediaPlayer = !isCurrentMediaPlayer;
    if (isCurrentMediaPlayer) {
        try {
            if (mediaPlayer != null) {
                playBtn.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.ic_play, null));
                seekBar.setProgress(0);
                mediaPlayer.stop();
                timerClass.purge();
                timerClass.cancel();
            }
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setDataSource(message.getVoice().getUrl());
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    if (mp.isPlaying()) {
                        mp.pause();
                        playBtn.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.ic_play, null));
                    } else {
                        mp.start();
                        playBtn.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.ic_pause, null));

                    }

                    timer.setText(formatDuration(0));
                    seekBar.setMax(mediaPlayer.getDuration());
                    if (mediaPlayer != null) {
                        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                            @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) {

                            }
                        });
                    }


                    timerClass = new Timer();
                    timerClass.schedule(new MainTimer(timer, seekBar), 0, 1000);
                }
            });

            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    //mediaPlayer = null;
                    //mp.release();
                    timerClass.purge();
                    timerClass.cancel();
                    playBtn.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.ic_play, null));
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private class MainTimer extends TimerTask {
    private CfTextView timer;
    private SeekBar seekBar;

    private MainTimer(CfTextView timer, SeekBar seekBar) {
        this.timer = timer;
        this.seekBar = seekBar;
    }

    @Override
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                seekBar.setProgress(mediaPlayer.getCurrentPosition());
                timer.setText(formatDuration(mediaPlayer.getCurrentPosition()));
            }
        });
    }
}

当您点击任何播放按钮时,运行以下代码:

CustomIncomingVoiceMessageViewHolder.Payload payload = new CustomIncomingVoiceMessageViewHolder.Payload();
    payload.onPlayButtonClickListener = new CustomIncomingVoiceMessageViewHolder.onPlayButtonClickListener() {
        @Override
        public void onPlayButtonClick(Message message, final ImageView imageView, final CfTextView timer, final CfTextView time, final SeekBar seekBar) {
            //isCurrentMediaPlayer = !isCurrentMediaPlayer;
            playVoice(message, imageView, seekBar, timer);
        }
    };

我的视图持有者代码:

public class CustomIncomingVoiceMessageViewHolder extends MessageHolders.IncomingTextMessageViewHolder<Message> {

private ImageView playButton;
private SeekBar seekBar;
private CfTextView timer;
private CfTextView time;

public CustomIncomingVoiceMessageViewHolder(View itemView, Object payload) {
    super(itemView, payload);
    playButton = itemView.findViewById(R.id.playButton);
    seekBar = itemView.findViewById(R.id.seekBar);
    timer = itemView.findViewById(R.id.timerVoice);
    time = itemView.findViewById(R.id.timeVoice);
}

@Override
public void onBind(final Message message) {
    super.onBind(message);

    final Payload payload = (Payload) this.payload;
    playButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (payload != null && payload.onPlayButtonClickListener != null) {
                payload.onPlayButtonClickListener.onPlayButtonClick(message, playButton, timer, time,seekBar);
            }
        }
    });
}

public static class Payload {
    public onPlayButtonClickListener onPlayButtonClickListener;
}

public interface onPlayButtonClickListener {
    void onPlayButtonClick(Message message, ImageView imageView, CfTextView timer, CfTextView time,SeekBar seekBar);
}

}

我正在使用库 chatKit

enter image description here

问题可能是由于您的布局造成的 "CfTextView timer." 我遇到了同样的问题并通过如下设置我的 Textview 宽度 属性 解决了这个问题:

<TextView
    android:layout_width="match_parent" //This is what I changed
    android:layout_height="wrap_content"/>

<SeekBar
    android:layout_width="match_parent" //Check this as well
    android:layout_height="wrap_content"/>

我可以看到在你的可运行文件中你有这个:

seekBar.setProgress(mediaPlayer.getCurrentPosition());
timer.setText(formatDuration(mediaPlayer.getCurrentPosition()));

在这里您更新计时器的文本以匹配 mediaPlayer 的当前位置,因此如果您将文本视图的宽度设置为 wrap_content,它会导致您的 Recyclerview 自行调整大小。

尝试将这些更改应用于您的布局,看看它是否解决了滚动问题。 祝你好运!