![](/img/trans.png)
[英]Global Loader (LoaderManager) for reuse in multiple Activities / Fragments
[英]Multiple fragments with different loadermanager
我是android開發的新手,過去4個小時一直在尋找解決方案。
我在一個Activity中有2個片段,它們都使用不同的sqlite表存儲數據,然后將其放入適配器以在片段中顯示。
我正在使用Loader管理器為兩個片段創建了兩個不同的加載器(具有不同的ID)。 我在每個片段中定義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;
}
}
如果將所有LoaderManager函數放入每個Fragment中,那么應該沒有問題。 設置如下:
public class FragOne extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {}
public class FragTwo extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {}
然后,您可以在Fragment的onResume或類似的東西中初始化加載程序,這樣它將獨立於其他Fragment起作用。
我想建議使用常量變量作為加載程序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將永遠不會看到或訪問ID為FRAG_TWO_LOADER
的加載程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.