Видео не останавливается в ViewPager - PullRequest
0 голосов
/ 19 июня 2019

Я использую viewpager и его адаптер. Я отображаю изображение и видео согласно условию.

У меня нет фрагмента, потому что я использую PagerAdapter .

Код:

 pager.setOnPageChangeListener(pageChangeListener);

    pager.post(new Runnable() {
        @Override
        public void run() {
            pageChangeListener.onPageSelected(pager.getCurrentItem());
        }
    });
}

ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrollStateChanged(int arg0) {
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
    }

    @Override
    public void onPageSelected(int position) {

        View view = mediaFullScreenImageAdapter.getActiveView(pager);
        if (selectedPhotosByDate.get(position).getMessagetype().equalsIgnoreCase("VIDEO")) {
            CustomVideoPlayer video_player = (CustomVideoPlayer) view.findViewById(R.id.video_player);
            if (video_player.isPlaying()) {
                Log.v("THISCALLEDD", "Y" + " : " + position);
                video_player.pause();
            }
        }
    }
};


 @Nullable
public View getActiveView(final ViewPager viewPager) {
    final PagerAdapter adapter = viewPager.getAdapter();
    if (null == adapter || adapter.getCount() == 0 || viewPager.getChildCount() == 0) {
        return null;
    }

    int position;
    final int currentPosition = viewPager.getCurrentItem();

    for (int i = 0; i < viewPager.getChildCount(); i++) {
        final View child = viewPager.getChildAt(i);
        final ViewPager.LayoutParams layoutParams = (ViewPager.LayoutParams) child.getLayoutParams();
        if (layoutParams.isDecor) {
            continue;
        }
        final Field positionField;
        try {
            positionField = ViewPager.LayoutParams.class.getDeclaredField("position");
            positionField.setAccessible(true);
            position = positionField.getInt(layoutParams);
        } catch (NoSuchFieldException e) {
            break;
        } catch (IllegalAccessException e) {
            break;
        }
        if (position == currentPosition) {
            return child;
        }
    }
    return null;
}

Обновление:

 selectedPhotosByDate = appDatabase.chatMessagesDao().getMediaByGroupId(topicid, "Y");


    if (selectedPhotosByDate.size() > 0 && selectedPhotosByDate != null) {

        mediaFullScreenImageAdapter = new MediaFullScreenImageAdapter(MediaFullScreenSlideActivity.this, selectedPhotosByDate);
        pager.setAdapter(mediaFullScreenImageAdapter);

        for (int i = 0; i < selectedPhotosByDate.size(); i++) {
            if (messageid == selectedPhotosByDate.get(i).getMessageId()) {
                position = i;
                break;
            }
        }

        pager.setCurrentItem(position);
        pager.setOffscreenPageLimit(selectedPhotosByDate.size());
    }

Я могу получить значение logcat. Но мое видео не останавливается.

Если мое видео воспроизводится и пользователь должен пролистать другой элемент, воспроизводящий видео.

Продвинутая помощь приветствуется!

Ответы [ 3 ]

0 голосов
/ 19 июня 2019

Насколько я понимаю, вы хотите приостановить предыдущее видео, когда пользователь проведет пальцем в viewpager.

@Override
public void onPageSelected(int position) {

    View view = mediaFullScreenImageAdapter.getActiveView(pager);
    if (selectedPhotosByDate.get(position).getMessagetype().equalsIgnoreCase("VIDEO")) {
        CustomVideoPlayer video_player = (CustomVideoPlayer) view.findViewById(R.id.video_player);
        if (video_player.isPlaying()) {
            Log.v("THISCALLEDD", "Y" + " : " + position);
            video_player.pause();
        }
    }
}

вы получаете объект просмотра текущей активной позиции, но вы хотите приостановить видео (position - 1), вам необходимо иметь объект просмотра предыдущей позиции.

0 голосов
/ 19 июня 2019

Наконец-то решена проблема.

Я переместил этот код

   View view = mediaFullScreenImageAdapter.getActiveView(pager);
   CustomVideoPlayer video_player = (CustomVideoPlayer) view.findViewById(R.id.video_player);
   video_player.pause();

в onPageScrolled() метод вместо onPageSelected() метода.

0 голосов
/ 19 июня 2019

На основании документации здесь , onPageSelected вызывается при выборе новой страницы.Это означает, что активное представление, которое вы пытаетесь получить с помощью currentItem из ViewPager, вернет вам текущий выбранный элемент, а не ранее выбранный элемент.Так что ваша ссылка на video_player также неверна и, следовательно, она не работает.

Простой способ сделать это - иметь переменную currentPosition.Обновите его в onPageSelected, но перед обновлением получите его просмотр и приостановите видео.Таким образом, при каждом обращении к нему вы сначала получите предыдущий индекс, а затем в следующий раз обновите его до текущего индекса.

...