Как изменить страницу 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);
}
}