具有不同 loadermanager 的多个片段
Multiple fragments with different loadermanager
我是 android 开发的新手,过去 4 小时一直在寻找解决方案。
我在一个 Activity 中有 2 个片段,它们都使用不同的 sqlite 表来存储数据,然后将这些数据放入适配器以在片段中显示。
我正在使用加载器管理器为两个片段创建两个不同的加载器(具有不同的 ID)。我在每个片段中定义加载器回调函数。问题是当我使用一个片段加载数据时,在该片段的 OnCreateLoader 中 return 第二个片段的空数据。
这是我在一个片段中实现的代码:
@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
的加载器。
我是 android 开发的新手,过去 4 小时一直在寻找解决方案。
我在一个 Activity 中有 2 个片段,它们都使用不同的 sqlite 表来存储数据,然后将这些数据放入适配器以在片段中显示。
我正在使用加载器管理器为两个片段创建两个不同的加载器(具有不同的 ID)。我在每个片段中定义加载器回调函数。问题是当我使用一个片段加载数据时,在该片段的 OnCreateLoader 中 return 第二个片段的空数据。
这是我在一个片段中实现的代码:
@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
的加载器。