Я использую FragmentPagerAdapter для реализации интерфейса с вкладками. Мой 0-й фрагмент создает загрузчик во время создания и пытается повторно подключиться к загрузчику в onActivityCreated(). Здесь класс:
public class My0thFragment extends Fragment {
private boolean ranOnce = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public void onActivityCreated() {
if (!ranOnce) {
// if the first time we're being created, do an initial load of data.
getLoaderManager().initLoader(500, null, mMyCallback).forceLoad();
ranOnce = true;
} else {
// reconnect?
getLoaderManager().initLoader(500, null, mMyCallback);
// sanity check.
printAllLoaders(getLoaderManager());
}
}
private LoaderManager.LoaderCallbacks<Foo> mMyCallback = new LoaderManager.LoaderCallbacks<Foo>() {
@Override
public Loader<Foo> onCreateLoader(int arg0, Bundle arg1) {
return new FooLoader(getActivity(), arg1);
}
@Override
public void onLoadFinished(Loader<Foo> arg0, Foo arg1) {
Log.e(tag, "onLoadFinished()!");
}
@Override
public void onLoaderReset(Loader<Foo> arg0) {
Log.e(tag, "onLoaderReset()!");
}
};
}
И вот сценарий:
Поэтому я застрял здесь, я должен делать что-то неправильно, так как материал Loader должен был быть разработан для удобства использования разработчиками с учетом жизненных циклов фрагментов. Может ли кто-нибудь указать, что я здесь делаю неправильно?
спасибо
Вероятно, у вас есть два экземпляра одного и того же фрагмента, попробуйте уничтожить загрузчик при уничтожении фрагмента:
protected void onDestroy() {
if (getSupportLoaderManager().getLoader(0) != null) {
getLoaderManager().getLoader(0).abandon();
getSupportLoaderManager().destroyLoader(0);
}
super.onDestroy();
}
Не знаете, решили ли вы свою проблему или нет, но вы должны вызвать forceLoad() на Fragment.onStart() вместо Fragment.onActivityCreated().
MyCallback.onLoadFinished() никогда не вызывается, потому что ваш "myCallback" на самом деле не привязан к загрузчику до тех пор, пока ваш фрагмент не будет запущен.
См. Пример файла кода FragmentTabsPager.java из API Demos или Support4Demos. Он предоставляет ViewPager и TabHost, которые управляют одним и тем же набором фрагментов. Я взломал его, чтобы охватить именно тот случай, который вы описали. (Вы обращались ко мне напрямую?) Главное отметить, что пример приложения не отделяет фрагменты в ViewPager.
Здесь часть, где я ее взломал:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTabHost = (TabHost)findViewById(android.R.id.tabhost);
mTabHost.setup();
mViewPager = (ViewPager)findViewById(R.id.pager);
mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);
mTabsAdapter.addTab(mTabHost.newTabSpec("fraga").setIndicator("Fragment A"),
FragmentA.class, null);
mTabsAdapter.addTab(mTabHost.newTabSpec("fragb").setIndicator("Fragment B"),
FragmentB.class, null);
if (savedInstanceState != null) {
mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
}
}
Фрагмент A - это тот, который содержит Loader.