Вопрос

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

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

Бонусные баллы, если вы можете сказать мне, как можно изменить, какой LoaderManager вы используете. Если я хочу, чтобы каждый фрагмент в моей деятельности использовал один и тот же погрузочный манагер (некоторые из них тянут одни и те же данные, и обмена погрузчиками было бы неплохо), возможно ли это?

Это было полезно?

Решение

В настоящее время я переношу свое приложение в пакет совместимости Android (в основном для загрузчика и фрагментов). В настоящее время я пытаюсь поделиться загрузчиком между двумя фрагментами, чтобы сэкономить запрос на мой ContentProvider. Добро пожаловать в мой мир! ;)

Простой вариант использования:

- DummyActivity расширяет фрагментируемость / log.d (constants.logtag, "DummyActivity.oncreate" + getSupportLoaderManager (). ToString ());

- DataFragment Extends Fragment реализует LoaderManager.LoaderCallBacks / log.d (constants.logtag, "DataFragment.oncreate" + GetLoaderManager (). ToString ());

- ReportFragment Extends Fragment реализует LoaderManager.LoaderCallBacks / log.d (constants.logtag, "ReportFragment.onCreate" + GetLoaderManager (). ToString ());

DummyActivity инстановирует фрагмент данных, а более поздние инстаквирует отчет. Выход LogCat показывает различные адреса для каждого LoaderManager. В качестве первого вывода, каждый фрагмент, кажется, имеет надлежащий погрузчик ...

Я продолжу и обновлю, если смогу ответить на ваш (наш;)) вопрос. Если вы добились какого -либо прогресса, пожалуйста, поделитесь своими ценными знаниями.

Обновлять:

Я предполагаю, что идентификаторы погрузчика связаны только с локальным объемом погрузчика погрузчика для определенного фрагмента, чтобы несколько локальных погрузчиков были связаны с фрагментом (так что вы можете вернуть другой загрузчик в OncreateLoader на основе идентификатора Arg и Вызовы инициаторов).

До сих пор мне удалось «повторно использовать» загрузчик (... или нет):

- Во -первых, я включил отладку LoaderManager с getSupportLoaderManager().enableDebugLogging(true); в фиктивной активности onCreate метод

- Тогда я позвонил getActivity().getSupportLoaderManager().initLoader(78, null, this); от onCreate Методы как данных, так и отчета.

- DataFragment раскрывает курсора, созданный onCreateLoader Метод с помощью сеттера на частном члене McUrsorloader.

- Отчет onCreateLoader Возвращает курсорог -загрузчик данных (после получения фрагмента с findFragmentByTag).

Отфильтрованный (и слегка запутанный) выход LogCat:

      DummyApp  D  DummyActivity.onCreate
      DummyApp  D  DataFragment.newInstance
      DummyApp  D  ReportFragment.newInstance
      DummyApp  D  DataFragment.onCreate
 LoaderManager  V  initLoader in LoaderManager{405a19d0 in SpecificAction{4059ee98}}: args=null
      DummyApp  D  DataFragment.onCreateLoader
 LoaderManager  V    Created new loader LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
      DummyApp  D  DataFragment.onCreate
      DummyApp  D  DataFragment.onActivityCreated
      DummyApp  D  ReportFragment.onCreate
 LoaderManager  V  initLoader in LoaderManager{405a19d0 in DummyActivity{4059ee98}}: args=null
 LoaderManager  V    Re-using existing loader LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
      DummyApp  D  SpecificActionReportFragment.onCreate
      DummyApp  D  SpecificActionReportFragment.onActivityCreated
 LoaderManager  V  Starting in LoaderManager{405a19d0 in DummyActivity{4059ee98}}
 LoaderManager  V    Starting: LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
 DummyProvider  D  query called
 DummyProvider  D  […]       
 DummyProvider  D  [end of query]
 LoaderManager  V  onLoadComplete: LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
 LoaderManager  V    onLoadFinished in CursorLoader{405a22e0 id=78}: CursorWrapperInner{405afb20}
      DummyApp  D  ReportFragment.onLoadFinished
      DummyApp  D  ReportFragment.displayActionReport
      DummyApp  D  DummyActivity.setReportViewsVisibility
      DummyApp  D  ReportFragment.setSaveReportImageViewVisibility

Два фрагмента добавляются из фиктивной активности onCreate Метод (отличается от описанного варианта использования, но это ничего не меняет на проблему, над которой мы работаем). К сожалению, погрузчик переназначен к последнему фрагменту, вызывая его (здесь отчетффрагмент)… и dataFragment.onloadfiniened никогда не вызывается. Как следствие, отчет-фрагмент выглядит хорошо, но фрагмент данных не является актуальным, поскольку обновление вызывается из onLoadFinished этого класса.

Я предполагаю, что существует базовый вызов Unregister, а затем вызов регистрации на курсоре.

Продолжение следует…

Другие советы

Да. Это сработало для меня. У меня есть 3 разных фрагмента в ящике для навигации, где одни и те же данные заполняются в разных списках. (Все фрагменты являются частью одной и той же деятельности).

Мой asynctaskloader:

public class MyTaskLoader extends AsyncTaskLoader<HashMap<String, Integer>> {

public MyTaskLoader(Context context) {
    super(context);
}

@Override
public HashMap<String, Integer> loadInBackground() {
...
return hashMap;
}

...
}

Используйте один идентификатор загрузчика во всех фрагментах.

Фрагмент1:

public class Fragment1 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> {
@Override
public void onCreate(Bundle savedInstanceState) {

//initialize adapter

getActivity().getSupportLoaderManager().initLoader(0, null, this);

}

@Override
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) {
    // TODO Auto-generated method stub

    return new MyTaskLoader(getActivity());
}

@Override
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0,
        HashMap<String, Integer> data) {
    // TODO Auto-generated method stub

    listAdapter.setData(data.keySet());

}

@Override
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) {
    // TODO Auto-generated method stub

    listAdapter.setData(null);
}
}

Используйте тот же идентификатор для фрагмента2:

public class Fragment2 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> {
@Override
public void onCreate(Bundle savedInstanceState) {

//initialize adapter

getActivity().getSupportLoaderManager().initLoader(0, null, this);

}

@Override
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) {
    // TODO Auto-generated method stub

    return new MyTaskLoader(getActivity());
}

@Override
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0,
        HashMap<String, Integer> data) {
    // TODO Auto-generated method stub

    listAdapter.setData(data.keySet());

}

@Override
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) {
    // TODO Auto-generated method stub

    listAdapter.setData(null);
}
}

Адаптер должен быть инициализирован перед инициализацией загрузчика. Работает до сих пор. Но это правильный путь? Есть ли лучший метод использования общего загрузчика для нескольких фрагментов?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top