Я пытаюсь понять, как работает этот код пользовательского интерфейса. У меня есть фрагмент, который содержит представление ViewPager. После того, как я сделаю вызов API и соберу данные, код вызывает функцию, которая выглядит следующим образом:
override fun setData(data: List<String>?) {
val before = myViewPager.currentItem
myViewPager.adapter = MyViewPagerAdapter(data)
val after = myViewPager.currentItem
...
}
Я пытаюсь понять этот сценарий; Я создаю этот фрагмент, появляется мой пользовательский интерфейс ViewPager и прокручиваю до 5-го элемента из списка из 20 элементов. Затем я переключаюсь на другой фрагмент и возвращаюсь к этому фрагменту из backStack. Волшебным образом (используя, по крайней мере, Android magi c), когда мой код запускается, переменная before будет 0. Но после того, как я назначу свой адаптер, «after» покажет 4 (5-й элемент в списке на основе 0).
Итак, мой вопрос к вам, умные SO, - как Android восстанавливает местоположение / текущее состояние элемента ViewPagers?
Как я понимаю, когда мой фрагмент помещается в backstack, его представления уничтожен ... и мой код создает новый адаптер, так что даже адаптер новый. Так что в моем смущенном уме мой новый взгляд и новый Адаптер каким-то образом получают состояние ... откуда-то. Просматривая исходный код ViewPager, я вижу следующий код:
if (mAdapter != null) {
if (mObserver == null) {
mObserver = new PagerObserver();
}
mAdapter.setViewPagerObserver(mObserver);
mPopulatePending = false;
final boolean wasFirstLayout = mFirstLayout;
mFirstLayout = true;
mExpectedAdapterCount = mAdapter.getCount();
if (mRestoredCurItem >= 0) {
mAdapter.restoreState(mRestoredAdapterState, mRestoredClassLoader);
setCurrentItemInternal(mRestoredCurItem, false, true);
mRestoredCurItem = -1;
mRestoredAdapterState = null;
mRestoredClassLoader = null;
} else if (!wasFirstLayout) {
populate();
} else {
requestLayout();
}
}
Что выглядит подозрительно актуально, но я не могу следить за ним. Может кто-нибудь объяснить мне, что происходит?