在应用活动中,我ViewPager
附加了FragmentPagerAdapter
,其中有三个项目,所有项目都有附加到游标加载器的列表视图。
public static class TaskListFragment extends Fragment implements LoaderCallbacks<Cursor> {
public TaskListFragment() {
}
protected static final String excludeCompletedArg = "excludeCompleted";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
getLoaderManager().initLoader(filter, cursorArgs, this);
...
}
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
// TODO Auto-generated method stub
return new CursorLoader(getActivity(),
Uri.parse("content://someurl"),
null,
null,
new String[] { Integer.toString(arg0), arg1.getString(TaskListFragment.excludeCompletedArg) },
null);
}
}
但是我可以强制用新的bundle参数重新加载游标?举个例子,我处理主要活动的onTabReselected
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
LoaderManager loaderManager = mSectionsPagerAdapter.getItem(tab.getPosition()).getLoaderManager();
}
这是例外。
我不想使用FragmentStatePagerAdapter
。
答案 0 :(得分:1)
我假设你想在某些情况下重新加载光标。为此,您可以使用restartLoader方法。在你的方法onTabReselected中你只需要重新启动给定id的加载器并传入参数来重新创建。
getLoaderManager().restartLoader(id, args, this);
它就像initLoader一样,但总是强制重新加载。你的onCreateLoader模式应该是:
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) {
if (loaderId == ARBITRARY_LOADER_ID) {
// create and return Cursor Loader
}
}
参见: http://developer.android.com/reference/android/app/LoaderManager.html http://developer.android.com/guide/components/loaders.html
答案 1 :(得分:1)
public static class TaskListFragment extends Fragment implements LoaderCallbacks<Cursor> {
private static Hashtable<Integer, LoaderCallbacks<Cursor>> loadedFragments = null;
public static void ReloadCursor(int fragmentIndex) {
Bundle cursorArgs = new Bundle();
cursorArgs.putString("someArg", "someArgNewValue");
((Fragment) loadedFragments.get(fragmentIndex)).getLoaderManager().restartLoader(fragmentIndex, cursorArgs, loadedFragments.get(fragmentIndex));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
if (loadedFragments == null) {
loadedFragments = new Hashtable();
}
Bundle cursorArgs = new Bundle();
cursorArgs.putString("someArg", "someArgValue");
getLoaderManager().initLoader(fragmentIndex, cursorArgs, this);
loadedFragments.put(fragmentIndex, this);
...
}
}
然后从父活动调用TaskListFragment.ReloadCursor(int fragmentIndex)
,例如,从onTabReselected
调用。它有效。
有任何更简单方法的建议吗?
答案 2 :(得分:0)
有两种方法可以解决, 1)如果Loader在Activity上,只需重启loader。 例如getLoaderManager()。restartLoader(id,bundle,callback);
2)如果Loader在片段上,则从其宿主Activity重启片段, 通过在片段上创建一个接口,将详细信息发送到Activity,并在details为true时重新启动片段。