В этом сценарии ViewPager с шестью фрагментами реализуется внутри действия. Перелистывание между фрагментами отключено, поэтому для смены текущего фрагмента используется кнопка. На сервер отправляется GET-запрос, и данные ответа отображаются в каждом фрагменте после завершения свайпа.
Первый подход (с использованием setUserVisibleHint)
Первоначально Метод setUserVisibleHint использовался для запуска запроса GET всякий раз, когда фрагмент становился видимым. Однако этот подход приводил к задержке анимации смахивания из-за немедленного выполнения запроса.
Второй подход (с использованием OnPageChangeListener)
Чтобы преодолеть задержку анимации , в ViewPager был добавлен OnPageChangeListener. Этот прослушиватель отслеживает состояние прокрутки страницы и отправляет запрос GET, когда нужный фрагмент становится полностью видимым (т. е. состояние прокрутки равно IDLE).
Проблема и решение
второй подход сработал хорошо, но при выполнении sendGetRequest() возникло исключение NullPointerException. Это произошло потому, что ссылка на фрагмент не была получена должным образом. Чтобы решить эту проблему, необходимо было сохранить ссылки на фрагменты в методе InstantiateItem FragmentPagerAdapter. Затем в OnPageChangeListener вместо создания нового фрагмента можно использовать указанный фрагмент из ViewPagerPagerAdapter.
Обновленный код для ViewPager2 (Kotlin)
viewPager.registerOnPageChangeCallback(
object: ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
val frag: Fragment = mAdapter.fragments[position]
if (frag != null && frag is FragmentTwo) {
(frag as FragmentTwo).sendGetRequest()
}
}
}
)
Здесь mAdapter относится к FragmentPagerAdapter, используемому в ViewPager2.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3