如何以编程方式在ViewPager中显示下一个视图?


107

我创建了一个ViewPager,并且一切正常,但是我想在ViewPager外部有一个上一个next按钮,该按钮可用于在ViewPager内部导航。如何在不手动滑动的情况下转到ViewPager上的下一个项目?


39
这不是工作viewpager.setCurrentItem(int index); ?
blessenm

确实,我想这个问题是重复的。
Vaibhav Mishra

Answers:


154

正如blessenm回答viewpager.setCurrentItem(int index)的那样,要走的路。


5
不幸的是,当用户手动滑动以及使用setCurrentItem跳转时,我的确得到了不同的行为。呼叫顺序相反。滑动时,它首先调用OnPageChangeListener#onPageSelected,然后在片段中调用setUserVisibleHint。如果我使用setCurrentItem,它将首先在片段中调用setUserVisibleHint,然后调用OnPageChangeListener#onPageSelected,这对我而言确实是一个问题:/所以我希望找到一种方法来保持自然行为,但仍以编程方式移动到另一页。
AgentKnopf 2014年

@Vaibhav如果我想显示下一个活动视图,该
怎么办

@AgentKnopf您是否设法找到此问题的解决方案?我还看到了这种奇怪的行为,但是当我以编程方式切换到下一个/上一个片段时,找不到保持常规刷卡流程的方法。
吉尔(Gil)2016年

@Gil恐怕不是-我删除了当前视图的程序化更改,只允许滑动。但是,我们稍后完全更改了实现,因此我不再进一步探讨此问题。
AgentKnopf

107

一个完整的实现只是为了完整性:

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中设置了按钮的单击侦听器,在这种情况下,即使您不需要它,也必须具有view参数。
Ashish Tanna

页面滑动动画不来了吗?
Lavekush Agrawal

18

最简单的方法是:

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

请注意,这不适用于ViewPager2
Micer

0

我修复它,更好,ty 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);
        }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.