【问题标题】:Recreate cursorloader for fragment为片段重新创建游标加载器
【发布时间】:2013-12-24 22:00:48
【问题描述】:

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

【问题讨论】:

    标签: android reload android-cursorloader fragmentpageradapter


    【解决方案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

    【讨论】:

    • 我不知道 LoadManager 是独立于实例的。 getSupportLoaderManager().initLoader(loaderId, args, (android.support.v4.app.LoaderManager.LoaderCallbacks&lt;Cursor&gt;) mSectionsPagerAdapter.getItem(loaderId)) 抛出异常 Fragment TaskListFragment{********} 未附加到 Activity
    • 您可以尝试调用 getLoaderManager().restartLoader(id, args, getActivity());在每个片段的 onResume() 中。
    • onResume 部分有效。它有一些问题。何时删除当前选项卡 onResume 将不会调用。而且我不需要每次调用onResume 时都重新加载游标,所以我需要在onTabReselected 中为某些Fragment 设置一些标志,并为此Fragment 强制onResume。它是如此复杂,所以我决定使用FragmentStatePagerAdapter。谢谢。
    【解决方案2】:
        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。它有效。

    对更简单的方法有什么建议吗?

    【讨论】:

      【解决方案3】:

      有两种方法可以解决, 1)如果加载器在一个活动上,只需重新启动加载器。 例如 getLoaderManager().restartLoader(id,bundle,callback);

      2) 如果Loader在一个Fragment上,从它的宿主Activity重启这个fragment, 通过在 Fragment 上创建一个接口将其详细信息发送到 Activity 并在 details 为 true 时重新启动 Fragment。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-15
        • 2012-11-25
        • 2022-10-12
        • 2020-01-23
        • 1970-01-01
        相关资源
        最近更新 更多