2015-12-18 2 views
0

Я довольно новичок в разработке android и искал решение за последние 4 часа.Несколько фрагментов с различными loadermanager

У меня есть 2 фрагмента в действии, и оба они используют разные таблицы sqlite для данных, которые затем будут помещаться в адаптеры для отображения внутри фрагмента.

Я использую диспетчер Loader, создав два разных загрузчика (с разными идентификаторами) для двух фрагментов. Я определяю функции обратного вызова Loader в каждом фрагменте. Проблема заключается в том, когда я загружаю данные с помощью одного фрагмента, в OnCreateLoader этого фрагмента возвращают нулевые данные для второго фрагмента.

вот код, который я реализован в одном фрагменте:

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    if (id==1){ 
     String[] projection = { 
       NoticeTable.COLUMN_ID,NoticeTable.COLUMN_TITLE 
     }; 
     CursorLoader cursorLoader = new CursorLoader(this, 
       NoticeContentProvider.ALL_NOTICE_URI, projection, null, null, null); 
     return cursorLoader; 
    } 
    else{ 
     return null; 
    } 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 

    switch (loader.getId()) { 
     case 1: 
      adapter.swapCursor(data); 
      break; 
     case 0: 
      break; 
    } 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    switch (loader.getId()) { 
     case 1: 
      adapter.swapCursor(null); 
      break; 
     case 0: 
      break; 
    } 
} 

ответ

1

Если поставить все свои функции LoaderManager внутри каждого фрагмента, вы не должны иметь проблемы. Установка будет выглядеть так:

public class FragOne extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {} 
public class FragTwo extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {} 

Затем, вы можете инициализировать загрузчик внутри onResume фрагмента или что-то подобное, так что она будет работать независимо от другого фрагмента.

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

public class FragOne extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { 
    private static final int FRAG_ONE_LOADER = 0; 

    public void onLoaderReset(Loader<Cursor> loader) { 
     switch(loader.getId()) { 
     case FRAG_ONE_LOADER: 
      doStuff(); 
      break; 
     default: 
      break; 
     } 
    } 
} 

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

+1

Я использовал диспетчер загрузчика из библиотеки поддержки, которая была специфична для активности. Изменено это для диспетчера загрузчика и все его работоспособность. Благодаря! Кстати, можно ли в этом случае применить диспетчер загрузчика вместо диспетчера загрузчика. Один менеджер загрузчика, специфичный для одного действия? –

+0

Я полагаю, это возможно, но я не совсем уверен, что вы имеете в виду. Когда я думаю об этом, каждый ListView специфичен для каждого фрагмента, поэтому я считаю, что Fragment должен нести за него ответственность. Если вы хотите поместить его в Activity, вы можете просто иметь два экземпляра адаптера и назначить каждый адаптер для соответствующего ListView, я думаю, что он может работать с некоторыми настройками. – AdamMc331