У меня есть приложение, основной функцией навигации которого является ViewPager с практически бесконечными страницами. Я использую что-то похожее на InfiniteViewPager (с FragmentStatePagerAdapter
), начиная навигацию в середине ViewPager. поэтому есть страницы слева и справа для начала. Я также использую отрицательные поля mPager.setPageMargin(-50);
, чтобы страницы с обеих сторон были немного видны.
Я загружаю много данных из Интернета, поэтому я сам обрабатываю изменения конфигурации, используя android:configChanges="orientation|keyboardHidden"
и переопределение onConfigurationChanged
в своей деятельности. В основном я не хочу воссоздавать свою активность, потому что я думаю, что изменение ориентации займет слишком много времени.
Проблема
Я открываю приложение, свайпаю в любом направлении, жду, пока ViewPager прекратит анимацию, затем меняю ориентацию. Текущая страница теперь немного смещена от центра, и одна соседняя страница более открыта, чем другая. Иногда одна из соседних страниц полностью оказывается за кадром.
Если я коснусь страницы, ViewPager прокрутится до текущей страницы и отобразится, как и ожидалось, но если я этого не сделаю, отображение будет неправильным. У меня возникает эта проблема при переходе от пейзажа к портрету и от портрета к пейзажу. Я пытался установить OnGlobalLayoutListener
и выполнить mViewPager.setCurrentItem(mViewPager.getCurrentItem())
, но ViewPager
игнорирует setCurrentItem
, если вы попросите его установить текущий элемент на то, что на самом деле является текущим элементом.
Код
Основная деятельность
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//whatever I do in here doesn't make a difference.
//my viewpager still displays off center, even if I do nothing custom
}
Адаптер пейджера
private class MyAdapter extends FragmentStatePagerAdapter{
public CarouselPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
PageData dataForThisPage = mModel.getDataForPage(position);
PageContainerFragment f = PageContainerFragment.create(position, dataForThisPage);
return f;
}
@Override
public int getCount() {
return 2000;
}
}
Я пытался понять это в течение нескольких часов, и я ничего не могу получить. Любая помощь будет принята с благодарностью!
Изменить: стиль