如何更改ViewPager的页面?


150

我在我的应用程序中使用ViewPager,并在主Activity中对其进行定义。在onCreate方法内部,我从SharedPreferences加载了一些页面,然后将其传递给PagerAdapter:

@Override
public int getCount() {
    return numberOfPages;
}

问题是,如果我将“偏好设置”(或其他“活动”)中的该数字更改为我之前查看过的其他页面索引,则我的应用程序将崩溃,因为当我使用此ViewPager返回到活动时,此索引超出范围。只需更改活动ViewPager的页面即可对其进行修复。有什么办法吗?

Answers:


394

我不确定我是否完全理解该问题,但是从您的问题标题来看,我猜您正在寻找的是pager.setCurrentItem( num )。这样一来,您就可以通过编程方式切换到中的另一个页面ViewPager

如果这不是问题,我需要查看logcat的堆栈跟踪,以更具体地进行说明。


3
是的,这正是我所需要的。我将其设置为0in onPause方法,没有崩溃。谢谢。
罗马

1
实际上,ViewPager上的文档很少。+1。
Arnab Chakraborty

1
如果您的寻呼机花费大量时间来加载页面,而您无法使用setOffscreenPageLimit(1),因为默认情况下,从当前位置查看寻呼机加载+1​​和-1页
Ajay Pandya

这不起作用,我只是收到一条错误消息,指出该片段已被添加。
BlondeSwan


18

如果不检查代码,我认为您所描述的是页面不同步并且数据过时。

您说要更改页面数,然后由于访问旧页面集而崩溃。对我来说,这听起来像是您pageAdapter.notifyDataSetChanged()更改数据后没有打电话。

当您viewPager显示一组10页的第3页,并且切换到只有5页的一组时,请致电notifyDataSetChanged(),您会发现您现在正在查看新组的第3页。如果您以前正在查看旧集的第8页,则在放入新集并致电后notifyDataSetChanged()会发现现在正在查看新集的最后一页而不会崩溃。

如果仅更改当前页面,则可能只是掩盖了问题。


1
加上1用于notifyDataSetChanged()
madhu527'1

@理查德,你救了我的好友。10000+notifyDataSetChanged()
阿里

15

要切换到另一页,请尝试以下代码:

viewPager.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        viewPager.setCurrentItem(num, true);
    }
}, 100);

1
完善!我试图在没有postDelay方法的情况下使用它,但是它没有用。您知道为什么它可以用这种方法吗?谢谢!:)
Georgi Koemdzhiev

同样的问题...为什么项目会随着这种延迟而变化,而不是其他?
Kalyan Raghu

@GeorgiKoemdzhiev因为调用时视图尚未结束viewPager.setCurrentItem
Zohab Ali

3

补充答案

我最初在ViewPager从其他类方法获取引用时遇到了麻烦,因为addOnTabSelectedListener做了一个匿名内部类,而后者又需要ViewPager声明该变量final。解决方案是使用类成员变量,而不使用匿名内部类。

public class MainActivity extends AppCompatActivity {

    TabLayout tabLayout;
    ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        viewPager = (ViewPager) findViewById(R.id.pager);
        final PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

        // don't use an anonymous inner class here
        tabLayout.addOnTabSelectedListener(tabListener);

    }

    TabLayout.OnTabSelectedListener tabListener = new TabLayout.OnTabSelectedListener() {

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    };

    // The view pager can now be accessed here, too.
    public void someMethod() {
        viewPager.setCurrentItem(0);
    }

}
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.