Как изменить страницу ViewPager?

Я использую ViewPager в своем приложении и определяю его в основном мероприятии. Внутри метода onCreate я загружаю некоторое количество страниц из SharedPreferences, а затем передаю его в PagerAdapter:

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

Проблема заключается в том, что если я изменил бы это число в настройках (или другом мероприятии) на какой-то другой, чем раньше, индекс страницы, который я просматривал раньше, мое приложение выходит из строя, потому что этот индекс выходит за пределы, когда я возвращаюсь к активности с помощью этого ViewPager. Его можно устранить, просто изменив активную страницу ViewPager. Есть ли способ сделать это?

Solutions Collecting From Web of "Как изменить страницу ViewPager?"

Я не уверен, что полностью понимаю вопрос, но из названия вашего вопроса я предполагаю, что вы ищете pager.setCurrentItem( num ) . Это позволяет вам программно переключаться на другую страницу в ViewPager .

Мне нужно было бы увидеть трассировку стека из logcat, чтобы быть более конкретным, если это не проблема.

Не проверяя свой код, я думаю, что вы описываете, что ваши страницы не синхронизированы, и у вас есть устаревшие данные.

Вы говорите, что вы меняете количество страниц, а затем разбиваетесь, потому что получаете доступ к старому набору страниц. Это звучит для меня, как будто вы не вызываете pageAdapter.notifyDataSetChanged() после изменения ваших данных.

Когда ваш viewPager покажет страницу 3 из 10 страниц, и вы переходите к набору только с 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 сделал анонимный внутренний класс, который, в свою очередь, потребовал, ViewPager переменная 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); } }