如何更改ViewPager的页面?

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

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

问题是,如果我将首选项(或另一个Activity)中的此数字更改为之前查看的其他页面索引,则我的应用程序崩溃是因为此索引在返回到使用此ViewPager的活动时超出范围。 它可以通过更改活动ViewPager的页面来修复。 有没有办法做到这一点?

我不确定我是否完全理解这个问题,但是从你的问题的标题,我猜你正在寻找的是pager.setCurrentItem( num ) 。 这使您可以编程切换到ViewPager另一个页面。

如果这不是问题,我需要从logcat中看到一个堆栈跟踪。

不检查你的代码,我认为你所描述的是你的网页不同步,你有陈旧的数据。

你说你正在改变页面的数量,然后崩溃,因为你正在访问旧的一组页面。 这听起来像你不改变你的数据后调用pageAdapter.notifyDataSetChanged()

当你的viewPager显示的是第10页中的第3页,并且你只改变了一个只有5的集合,然后调用notifyDataSetChanged() ,你会发现你正在查看新集合的第3页。 如果您之前查看旧集合的第8页,则在放入新集合并调用notifyDataSetChanged()您将发现现在正在查看新集合的最后一页,而不会崩溃。

如果你只是改变你的当前页面,你可能只是掩盖了这个问题。

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

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

向右滑动

viewPager.arrowScroll(View.FOCUS_RIGHT);

向左滑动

viewPager.arrowScroll(View.FOCUS_LEFT);

补充答案

我最初无法从其他类方法获取对ViewPager的引用,因为addOnTabSelectedListener了一个匿名内部类,而这又要求将ViewPagervariables声明为final 。 解决scheme是使用类成员variables,而不是使用匿名内部类。

 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); } }