首页 > 解决方案 > 使用媒体播放器播放音频时 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

在此处输入图像描述

标签: androidandroid-recyclerviewchatandroid-mediaplayer

解决方案


问题可能是由于您有“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 自行调整大小。

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


推荐阅读