首页 文章

如何更改ViewPager的页面?

提问于
浏览
139

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

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

问题是,如果我将Preferences(或其他Activity)中的这个数字更改为我之前查看的其他页面索引,我的应用程序崩溃,因为当我使用此ViewPager返回活动时,此索引超出范围 . 只需更改活动的ViewPager页面即可修复它 . 有什么办法吗?

5 回答

  • 17

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

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

    我猜你正在寻找的是 pager.setCurrentItem( num ) . 这允许您以编程方式切换到 ViewPager 中的另一个页面 .

    如果这不是问题,我需要从logcat看到更具体的堆栈跟踪 .

  • 11

    Supplemental answer

    我原本无法从其他类方法获取对 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);
        }
    
    }
    
  • 11

    向右滑动

    viewPager.arrowScroll(View.FOCUS_RIGHT);

    向左滑动

    viewPager.arrowScroll(View.FOCUS_LEFT);

  • 374

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

    你说你正在改变页数,然后崩溃,因为你正在访问旧的页面集 . 这听起来像你在更改数据后没有调用 pageAdapter.notifyDataSetChanged() .

    viewPager 显示一组10页的第3页,并且您更改为仅有5的设置时,然后调用 notifyDataSetChanged() ,您将找到的是您现在正在查看新设置的第3页 . 如果您之前正在查看旧集的第8页,则在放入新集并调用 notifyDataSetChanged() 之后,您会发现现在正在查看新集的最后一页而不会崩溃 .

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

相关问题