Не запускайте каждый фрагмент сразу в ViewPager - PullRequest
0 голосов
/ 19 февраля 2020

Я реализовал View Pager в моем приложении. Он перемещается между фрагментами, проблема в том, что даже если отображается только первый фрагмент, создается другой фрагмент. Это вызывает проблемы, потому что во втором фрагменте я отображаю полосу загрузки , и таким образом она отображается в первом фрагменте вместо второго.

Это мой код ViewPager:


class FragmentViewPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {

    override fun getItem(position: Int): Fragment {
        if (position == 0){
            return VentFragment()
        }
        return ConversationsFragment()
    }

    override fun getCount(): Int {
        return 2
    }

}

Во втором фрагменте я называю полосу загрузки следующим образом: onCreateView:

 loading = ProgressDialog(context)

        loading.setTitle(getString(R.string.loading))
        loading.setMessage(getString(R.string.fetching_your_data))
        loading.setCanceledOnTouchOutside(false)
        loading.show()

Это из-за контекста? Кажется, я не могу найти ошибку ...

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

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

Так работает ViewPager. Второй фрагмент должен быть доступен, чтобы перейти к нему, когда пользователь проводит пальцем, а не ждать, пока вы создадите его после того, как пользователь начал считывать.

во втором фрагменте я отображая полосу загрузки и таким образом она отображается в первом фрагменте вместо второго

Ваш второй фрагмент содержит ошибку. Фрагмент - особенно один ViewPager - не должен изменять пользовательский интерфейс, который находится за пределами самого фрагмента. Если вы исправите эту ошибку, ваша проблема с ViewPager должна go удалить.

0 голосов
/ 19 февраля 2020

Таким образом, можно выполнять «ленивую загрузку» данных пользовательского интерфейса с помощью ViewPager (я так делаю), поэтому данные и панель загрузки отображаются только при выборе страницы.

Обновление:

Я бы порекомендовал вам перейти на ViewPager2, поскольку ViewPager2 правильно поддерживает жизненный цикл фрагмента в отличие от ViewPager.

Это означает, что вы можете легко обновить свой заполнитель (или запустить панель загрузки) в фрагменте onResume Метод

Я только что сделал полный пример, используя ViewPager2 с использованием метода ViewPager, см. { ссылка } (Update2 имеет полный пример и похож на то, как вы можете это сделать если вы все еще хотите использовать ViewPager)

Обратите внимание, что оба метода приведут к тому, что обновление экрана отобразит правильные (последние) данные, это может быть во время перехода или с ViewPager2 и onResume, как только переход Закончено, но затем вы можете получить неверные старые данные или обновить второе окно, чтобы получить правильные обновленные данные.

...