VideoView in RecyclerView Adapter does not play

21 Views Asked by At

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.

0

There are 0 best solutions below