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

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

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

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

5 ответов


Я не уверен, что полностью понимаю вопрос, но из названия вашего вопроса я предполагаю, что то, что вы ищете, это 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 переменная для объявления 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);
    }

}