A VideoView, I played in a RecyclerView.ViewHolder, does not play. Here my source code:
if (holder instanceof VideoViewHolder) {
VideoViewHolder itemViewHolder = (VideoViewHolder) holder;
dateTextView = itemViewHolder.item.tvTime;
contentTextView = itemViewHolder.item.tvText;
btnShowMore = itemViewHolder.item.btnShowMore;
if (mode == MODE_NORMAL) {
String videoUrl = newsMessage.getVideo();
if (videoUrl != null) {
itemViewHolder.item.btnPlay.setVisibility(View.GONE);
itemViewHolder.item.btnPause.setVisibility(View.GONE);
// Set the video URI
itemViewHolder.item.videoView.setVideoURI(Uri.parse(videoUrl));
// Handle video loading error
itemViewHolder.item.videoView.setOnErrorListener((mediaPlayer, i, i1) -> {
itemViewHolder.item.containerVideo.setVisibility(View.GONE);
itemViewHolder.item.containerError.setVisibility(View.VISIBLE);
return true;
});
// Update UI when playback is ready
itemViewHolder.item.videoView.setOnPreparedListener(mp -> {
itemViewHolder.item.videoProgressBar.setVisibility(View.GONE);
itemViewHolder.item.btnPlay.setVisibility(View.VISIBLE);
itemViewHolder.item.videoOverlay.setVisibility(View.VISIBLE);
itemViewHolder.item.videoView.start();
itemViewHolder.item.videoView.pause();
});
// Update UI when when playback completed
itemViewHolder.item.videoView.setOnCompletionListener(mp -> {
itemViewHolder.videoPlaying = false;
itemViewHolder.item.btnPause.setVisibility(View.GONE);
itemViewHolder.item.btnPlay.setVisibility(View.VISIBLE);
itemViewHolder.item.videoOverlay.setVisibility(View.VISIBLE);
});
// Start playback when play button is pressed
itemViewHolder.item.btnPlay.setOnClickListener(v -> {
itemViewHolder.item.videoView.start();
itemViewHolder.videoPlaying = true;
itemViewHolder.item.btnPlay.setVisibility(View.GONE);
itemViewHolder.item.btnPause.setVisibility(View.GONE);
itemViewHolder.item.videoOverlay.setVisibility(View.GONE);
});
// Stop playback when pause button is pressed
itemViewHolder.item.btnPause.setOnClickListener(v -> {
itemViewHolder.item.btnPause.setVisibility(View.GONE);
itemViewHolder.item.btnPlay.setVisibility(View.VISIBLE);
itemViewHolder.item.videoOverlay.setVisibility(View.VISIBLE);
itemViewHolder.item.videoView.pause();
itemViewHolder.videoPlaying = false;
});
// Show play or pause button (depending on playback state) when touching the video view
itemViewHolder.item.videoView.setOnClickListener(v -> {
if (itemViewHolder.videoPlaying) {
if (itemViewHolder.item.btnPause.getVisibility() == View.GONE) {
itemViewHolder.item.btnPause.setVisibility(View.VISIBLE);
itemViewHolder.item.videoOverlay.setVisibility(View.VISIBLE);
} else {
itemViewHolder.item.btnPause.setVisibility(View.GONE);
itemViewHolder.item.videoOverlay.setVisibility(View.GONE);
}
}
});
itemViewHolder.item.containerVideo.setVisibility(View.VISIBLE);
itemViewHolder.item.containerError.setVisibility(View.GONE);
} else {
itemViewHolder.item.containerVideo.setVisibility(View.GONE);
itemViewHolder.item.containerError.setVisibility(View.VISIBLE);
}
} else {
itemViewHolder.item.containerVideo.setVisibility(View.GONE);
itemViewHolder.item.containerError.setVisibility(View.GONE);
}
}
The problem is, that I also have another ReyclerView in which the video plays. The URL is not broken, and returns HTTP 200. I have been searching for a solution for hours. Any ideas where the problem is? I really have no Idea anymore.