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.