ViewPager с фрагментами: сбой после изменения ориентации (отображается неверный фрагмент)

У меня есть ViewPager с PagerTitleStrip, который рисует фрагменты. Каждый фрагмент имеет StableArrayAdapter, который заполняет фрагмент информацией.

После изменения ориентации, когда я нажимаю на фрагменты, я получаю сбой: java.lang.IndexOutOfBoundsException: Index: 8, Size: 7

Когда изменение ориентации произведено, я вижу ту же страницу фрагмента, что и до изменения ориентации. Но если я нажму на него, произойдет сбой, потому что, вероятно, просмотрщик загрузил первый фрагмент вместо выбранного фрагмента.

Кажется, что когда происходит изменение ориентации, действие воссоздается (я хочу это, потому что я хочу, чтобы смарт-баннер от admob воссоздали с новой шириной), но фрагмент, вероятно, не воссоздается или что-то еще, поэтому, возможно, он указывает на другой фрагмент от окрашенного.

Как я могу избежать этого сбоя? может быть, есть какой-то способ сказать пейджеру, что он должен загрузить отображаемую страницу? как это можно сделать?

Я попытался сохранить текущий номер фрагмента и выбрать его при воссоздании, но сбой все еще происходит:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putInt("current_item", viewPager.getCurrentItem());
    super.onSaveInstanceState(savedInstanceState);
}
.
.
.
//code in onCreate()
viewPager.setAdapter(collectionPagerAdapter);
if (savedInstanceState != null) {
            int currentItem = savedInstanceState.getInt("current_item");                
            viewPager.setCurrentItem(currentItem);
}

Это мой макет XML.

<android.support.v4.view.ViewPager
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/pager"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_marginBottom="3dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintBottom_toTopOf="@+id/adView">
            <android.support.v4.view.PagerTitleStrip
                android:id="@+id/pager_title_strip"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="top"
                android:paddingTop="4dp"
                android:paddingBottom="4dp"
                style="@style/CustomPagerTitleStrip"/>
        </android.support.v4.view.ViewPager>

Это строка, в которой происходит сбой в адаптере StableArray, который заполняет фрагменты строками

Override public long getItemId(int position) { 
    return Math.abs(getItem(position).hashCode()); 
} 

1 ответ

Вы можете перейти по ссылке ниже, они объяснили обработку фрагментов и изменений ориентации viewPager.

https://medium.com/@roideuniverse/android-viewpager-fragmentpageradapter-and-orientation-changes-256c23bee035

Другие вопросы по тегам