android - 使用媒体播放器播放音频时 Recyclerview 滚动
问题描述
我正在开发一个聊天应用程序,这个应用程序具有发送语音聊天的能力声音播放正确,但是问题当我点击播放按钮时,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
解决方案
问题可能是由于您有“CfTextView 计时器”的布局。我遇到了同样的问题,并通过如下设置我的 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 的当前位置,因此如果您将 textview 的宽度设置为 wrap_content 它会导致您的 Recyclerview 自行调整大小。
尝试将这些更改应用于您的布局,看看它是否解决了滚动问题。祝你好运!
推荐阅读
- databricks - 如何在 Databricks 自动化集群上安装库
- google-cloud-platform - Google 存储:删除客户提供的加密密钥
- c# - 无法在某些 PC 上启动进程
- elasticsearch - 即使使用 update_by_query 顺序更新文档时,弹性搜索也会出现版本冲突
- encryption - rsa 解密和使用 nec
- java - 无法解析构造函数'BarEntry(java.lang.String, java.lang.Float)
- python - 使用 Python 读取 csv 文件中的特定行
- docker - 操作已超时 --> 无法解析 Windows 容器中的名称
- scala - Akka Streams:如何用未来的结果更新一个字段
- python - 如何使用 python 从 mongodb 导出特定字段并将其保存到数据框中