У меня есть FragmentActivity с ViewPager и FragmentPagerAdapter.
Каждый фрагмент в ViewPager должен загружать данные из веб-службы. Я написал LoaderManager / custom Loaders для выполнения вызовов веб-службы, анализа XML и т. Д., И они работают нормально.
Существует два возможных варианта управления загрузкой и фрагментами.
1) Основная деятельность по управлению загрузкой от имени фрагментов.
Фрагмент перезванивает основной FragmentActivity, запрашивая его данные. Операция проверяет, запущен ли загрузчик для этих данных, если нет, то создает его и выполняет загрузку.
В этом случае как мне сказать фрагменту, что данные загружены и готовы к рисованию. Я использую пользовательские загрузчики, а не простые курсоры, поэтому фрагмент будет заполнять свои текстовые представления и т. Д. Из экземпляра объекта, поэтому необходимо сообщить, когда объекты были заполнены.
Не похоже, что FragmentPagerAdapter позволяет вам выделять теги или идентификаторы для фрагментов, когда вы создаете их в getItem. Как я могу найти фрагмент из FragmentActivity и сказать ему нарисовать его данные?
2) Каждый фрагмент управляет собственной загрузкой.
Фрагмент инициализирует свой собственный загрузчик, каждый фрагмент имеет свой собственный onCreateLoader / onLoaderFinish и т. Д.
Проблема, с которой я здесь столкнулся, заключается в том, что, если пользователь запускает страницу с этой страницы во время работы загрузчика, фрагмент кажется уничтоженным (иногда). В результате onLoaderFinished не вызывается, и фрагмент не может сообщить основному действию, что оно завершено - основным действием является управление индикатором выполнения (setProgressBarIndeterminateVisibility) на панели действий.
Так какой же самый лучший шаблон проектирования, если у вас есть FragmentPagerAdapter, ViewPager с несколькими страницами, которым нужны свои собственные загрузчики?
Другая проблема, с которой я столкнулся, - это использование getSupportLoaderManager для проверки, работают ли какие-либо загрузчики. Я называю это из onLoadFinished. Если загрузчики не запущены, я могу скрыть индикатор прогресса. Однако hasRunningLoaders иногда возвращает true, хотя все загрузчики завершили.
LoaderManager lm = getSupportLoaderManager();
// If the loader is not already running, start it...
if (! lm.hasRunningLoaders()) {
setProgressBarIndeterminateVisibility(Boolean.FALSE);
}
Большое спасибо за любой совет или указание мне в направлении некоторых приличных образцов.
Ta
Мартин.