视频在ViewPager中没有暂停

时间:2019-06-19 06:03:18

标签: android android-viewpager android-videoview

我使用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 :(得分:0)

基于文档here,在选择新页面时将调用onPageSelected。这意味着,您尝试使用ViewPager中的currentItem获得的活动视图将为您返回当前选定的项目,而不是先前选定的项目。因此,您对video_player的引用也是错误的,因此无效。

执行此操作的一种简单方法是使用变量currentPosition。在onPageSelected中对其进行更新,但是在更新之前,请先获取其视图并暂停视频。这样,无论何时访问它,都将首先获取上一个索引,然后下次将其更新为当前索引。

答案 1 :(得分:0)

据我了解,您想在用户在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)的视频,您需要拥有先前位置的查看对象。

答案 2 :(得分:0)

最终解决了该问题。

我移动了此代码

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

改为onPageScrolled()方法,而不是onPageSelected()方法。