Как ViewPager восстанавливает свое состояние currentItem при возврате из BackStack? - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь понять, как работает этот код пользовательского интерфейса. У меня есть фрагмент, который содержит представление 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();
            }
        }

Что выглядит подозрительно актуально, но я не могу следить за ним. Может кто-нибудь объяснить мне, что происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...