如何在代码中展示ViewPager的下一个视图?

116

我创建了一个ViewPager,一切都运行良好,但是我希望在ViewPager之外有一个上一页下一页的按钮,可以用来在ViewPager内进行导航。如何在不手动滑动的情况下进入ViewPager的下一项?


40
这个方法 viewpager.setCurrentItem(int index) 不起作用吗? - blessanm86
我猜这个问题是重复的。 - Vaibhav Mishra
1
可能是如何更改ViewPager页面?的重复问题。 - mmd1080
4个回答

168

如blessenm所回答的,viewpager.setCurrentItem(int index)是正确的方式。


7
很遗憾,当用户手动滑动和我使用setCurrentItem跳转时,会出现不同的行为。调用顺序是相反的。当我滑动时,它首先调用OnPageChangeListener#onPageSelected,然后在片段中调用setUserVisibleHint。如果我使用setCurrentItem,它首先在片段中调用setUserVisibleHint,然后再调用OnPageChangeListener#onPageSelected,这对我的情况真的是一个问题 :/ 所以我希望找到一种方法保持自然行为,但仍然可以编程地移动到另一页。 - AgentKnopf
@Vaibhav 如果我想显示活动的下一个视图怎么办? - Prabs
@AgentKnopf,你解决了这个问题吗?我也遇到了这种奇怪的行为,但是在编程上切换到下一个/上一个片段时找不到保持常规滑动流的方法。 - Gilad Eshkoli
@Gil,恐怕不行 - 我删除了当前视图的编程更改,只允许滑动。然而,我们后来完全改变了实现方式,所以我没有进一步追究这个问题。 - AgentKnopf

118
为了完整性,提供一个完整的实现:
public void MoveNext(View view) {
    //it doesn't matter if you're already in the last item
    pager.setCurrentItem(pager.getCurrentItem() + 1);
}

public void MovePrevious(View view) {
    //it doesn't matter if you're already in the first item
    pager.setCurrentItem(pager.getCurrentItem() - 1);
}

你可能需要它。 例如,如果更改是由点击触发的,您可以使用 (nextBt.getId() == view.id) 来了解是什么导致了它。 - Tomas Wolf
2
@Sagar 他可能已经在xml中设置了按钮的点击监听器,在这种情况下,即使你不需要它,你也必须有视图参数。 - Ashish Tanna
页面滑动动画没有出现? - Lavekush Agrawal

19

最简单的方法是:

nextButton.setOnClickListener { pager.arrowScroll(View.FOCUS_RIGHT) }
prevButton.setOnClickListener { pager.arrowScroll(View.FOCUS_LEFT) }

0

我修复得更好了,谢谢Androiderson。

  private void MoveNextTopSlideShow(View view)
    {
        if (_viewPager_TopImageSlide.CurrentItem == _viewPager_TopImageSlide.ChildCount)
        {
            if (_viewPager_TopImageSlide.ChildCount > 0)
            {
                _viewPager_TopImageSlide.SetCurrentItem(0,true);
            }
        }
        else
        {
            //it doesn't matter if you're already in the last item
            _viewPager_TopImageSlide.SetCurrentItem(_viewPager_TopImageSlide.CurrentItem + 1, true);
        }
    }

    private void MovePreviousTopSlideShow(View view)
    {
        if (_viewPager_TopImageSlide.CurrentItem == 0)
        {
            if (_viewPager_TopImageSlide.ChildCount > 0)
            {
                _viewPager_TopImageSlide.SetCurrentItem(_viewPager_TopImageSlide.ChildCount-1, true);
            }
        }
        else
        {
            //it doesn't matter if you're already in the first item
            _viewPager_TopImageSlide.SetCurrentItem(_viewPager_TopImageSlide.CurrentItem - 1, true);
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接