为片段重新创建cursorloader

时间:2013-12-07 14:54:30

标签: android reload android-cursorloader fragmentpageradapter

在应用活动中,我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

3 个答案:

答案 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时重新启动片段。

相关问题