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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

слайд вправо

viewPager.arrowScroll(View.FOCUS_RIGHT);

слайд налево

viewPager.arrowScroll(View.FOCUS_LEFT);

Ответ 5

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

Мне изначально не удалось получить ссылку на 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);
    }

}