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

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

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

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

5 Solutions collect form web for “Как изменить страницу ViewPager?”

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

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

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

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

Когда ваш viewPager отображает страницу 3 из 10-ти страниц, и вы переходите к набору только с 5, затем вызывайте notifyDataSetChanged() , то, что вы найдете, теперь вы просматриваете страницу 3 нового набора. Если вы ранее просматривали страницу 8 старого набора, после ввода нового набора и вызова notifyDataSetChanged() вы обнаружите, что теперь вы просматриваете последнюю страницу нового набора без сбоев.

Если вы просто измените текущую страницу, вы можете просто маскировать проблему.

скользить вправо

viewPager.arrowScroll (View.FOCUS_RIGHT);

скользить влево

viewPager.arrowScroll (View.FOCUS_LEFT);

для перехода на другую страницу, попробуйте с этим кодом:

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

Дополнительный ответ

Первоначально мне не удалось получить ссылку на ViewPager из других методов classа, потому что addOnTabSelectedListener сделал анонимный внутренний class, что, в свою очередь, потребовало, ViewPager переменная ViewPager была объявлена final . Решение состояло в том, чтобы использовать переменную-член classа и не использовать анонимный внутренний class.

 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); } } 
  • Android ViewPager - просмотр предварительного просмотра страницы слева и справа
  • ViewPager PagerAdapter не обновляет View
  • Interesting Posts

    Как заставить Chrome разрешить смешанный контент?

    Как показать диалог, подтверждающий, что пользователь хочет выйти из Android-активности?

    Использование ActionBarSherlock с новой поддержкой SupportMapFragment

    Есть ли простой алгоритм, который может определить, является ли X простым, а не путать простого смертного программиста?

    Эффективное квантование цвета gif / изображения?

    Восстановить имена поклонников Facebook

    SSD очень медленный на ПК

    Разрешение отклонено для отношения

    Как вызвать веб-службу из jQuery

    Туннелирование FTP-соединения из дома, где сервер принимает только локальные IP-адреса

    Передача массива функции с переменным числом аргументов в Swift

    Как найти элемент массива, который повторяется как минимум N / 2 раза?

    Emacs: как переназначить Cx 5 2 (кадр переключения) на C-`в профиле .emacs

    Пожалуйста, порекомендуйте инструмент для рисования структур / классов и указателей

    NoClassDefFoundError JsonAutoDetect при анализе объекта JSON

    Давайте будем гением компьютера.