Как остановить воспроизведение видео при просмотре пейджера в Android?

Я использую View Pager, показывающий изображение и видео, я могу правильно отображать изображение и видео, но у меня проблема, когда я пролистываю видео, затем видео воспроизводится, но я пролистываю следующее или предыдущее, тогда видео все еще воспроизводится только на следующем или предыдущий экран, но когда я перемещаю два слайда вперед или назад, видео останавливается, но почему не на следующем или предыдущем слайде.

Я ищу его больше, но я не получил никакого решения, любая помощь будет заметна. Заранее спасибо.

Вот мой код адаптера:

public class SelectedMediaViewPagerAdapter extends PagerAdapter {
private final Context context;
private final LayoutInflater layoutInflater;
public ArrayList<MediaItem> mediaItems;
PlayerView playerView;
SimpleExoPlayer player;

public String path = "";

public SelectedMediaViewPagerAdapter(Context context, ArrayList<MediaItem> mediaItems) {

    this.mediaItems = mediaItems;
    this.context = context;
    layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    DefaultTrackSelector trackSelector = new DefaultTrackSelector();
    player = ExoPlayerFactory.newSimpleInstance(context, trackSelector);

}

@Override
public int getCount() {
    return mediaItems.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return (view == object);
}

@Override
public Object instantiateItem(final ViewGroup container, int position) {
    RelativeLayout layout = (RelativeLayout) layoutInflater.inflate(R.layout.item_selected_media_view_pager, container, false);
    RelativeLayout vidView= layout.findViewById(R.id.vidView);
    ImageView imgView = layout.findViewById(R.id.imgView);
    if (mediaItems.get(position).isVideo()) {
        imgView.setVisibility(View.GONE);
        vidView.setVisibility(View.VISIBLE);
        String video_url;
        playerView = layout.findViewById(R.id.player_view);
        final ProgressBar progressBar = layout.findViewById(R.id.progresbar_video_play);
        progressBar.setVisibility(View.VISIBLE);

        playerView.setPlayer(player);

        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context,
                Util.getUserAgent(context, context.getResources().getString(R.string.app_name)));
        // This is the MediaSource representing the media to be played.
        MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
                .createMediaSource(Uri.parse(mediaItems.get(position).getPath()));
        // Prepare the player with the source.
        player.prepare(videoSource);
        player.setPlayWhenReady(false);
        player.addListener(new Player.DefaultEventListener() {
            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                if (playWhenReady) {
                    progressBar.setVisibility(View.GONE);
                }
                super.onPlayerStateChanged(playWhenReady, playbackState);
            }
        });
    }else {
        // path = drawable.get(drawable.size() - position - 1);
        imgView.setVisibility(View.VISIBLE);
        vidView.setVisibility(View.GONE);
        Glide.with(context).load("file://" + mediaItems.get(position).getPath()).into(imgView);
    }
    container.addView(layout);
    return layout;
}



@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((RelativeLayout) object);
}

}


person sam chaudhari    schedule 19.01.2019    source источник
comment
ты смог решить??   -  person Vivek    schedule 03.05.2020


Ответы (1)


Это происходит потому, что ViewPager сохраняет ряд фрагментов «живыми» (в возобновленном состоянии) до и после текущего элемента. По умолчанию по 1 с каждой стороны. Свойство, определяющее это, — ViewPager.offScreenPageLimit. Это сделано для облегчения перехода к следующему/предыдущему виду при смахивании.

Вы можете использовать что-то вроде ниже, чтобы определить, когда страница изменится. Затем вам нужно будет уведомить viewModel или службу, к которой у каждого из ваших выгружаемых фрагментов есть доступ, чтобы они могли определить, должны ли они приостановить или продолжить воспроизведение своего мультимедиа:

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener {
    @Override
    public void onPageSelected(int position) {
       // find your player and pause it if it's not in the current view
       // Ideally you notify a viewModel that is shared between your paged
       // fragments here and let each one determine if it needs to pause 
       // its player.
    }
    @Override
    public void onPageScrollStateChanged(int state) { // do nothing }

    @Override
    public void onPageScrolled(int position, float offset, int offsetInPixels) { // do nothing }
})
person Barryrowe    schedule 13.06.2019