Android FragmentPagerAdapter с LoaderManager - PullRequest
4 голосов
/ 20 января 2012

У меня есть 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 Мартин.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2013

Я не уверен, что это полностью правильно, но я помню, что когда ваш фрагмент уничтожается, когда загрузчик получает данные в фоновом режиме, вызывается метод onLoaderReset (вместо onLoaderFinished). Это позволит вам правильно сбросить индикатор прогресса.

0 голосов
/ 20 января 2012

Что касается дизайна 1, я сделал нечто подобное, поддерживая переменную ссылки для фрагментов, которые я создаю. В методе getItem вашего FragmentPagerAdapter вы можете назначить созданный фрагмент этой переменной перед его возвратом. Это позволит получить доступ к вашим фрагментам из основной деятельности.

...