在Fragment中调用initLoader时?

时间:2013-09-10 19:36:06

标签: android android-fragments

我有一个非常简单的片段,包括ListView,CursorLoader和CursorAdapter。一切都在单一活动中(只是切换片段)。我的问题是onLoadFinished()在某些情况下根据我调用initLoader()的位置被调用两次。那些情况是:

  • 配置更改(旋转屏幕等)
  • 使用FragmentTransaction将当前片段替换为另一个片段,然后返回(弹出backstack)。在这种情况下,一个列表项的细节片段。

当initLoader()放入onCreateView()时,onAoseCreated()(在文档中推荐)onLoadFinished()在配置更改后被调用两次。有Rudik Krasniynos解释原因。但是当从backstack弹出更新的片段时,onLoadFinished()只被调用一次。

当initLoader()放在onResume()/ onStart()方法中时,上面的情况相反。两次调用onLoadFinished()用于弹出backstack,另一次调用用于配置更改。

所以问题是在没有调用onLoadFinished()两次的情况下初始化Loader的地方或方法,或者检查两次不是init Loader的内容。谢谢!

替换片段的代码:

FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.root_view, fragment, tag);
ft.addToBackStack(null);
ft.commit();

CursorAdapter代码:

//onCreateView
MyCursorAdapter mAdapter = new MyCursorAdapter(getActivity(), null, 0);
mList.setAdapter(mAdapter);
//in other/same lifecycle callbacks
getLoaderManager().initLoader(ID, null, this);

我正在使用支持库v18。

5 个答案:

答案 0 :(得分:4)

要避免在onLoadFinished中多次调用onResume初始化您的加载程序。

答案 1 :(得分:1)

我在onCreate中调用它,据我所知这是最好的做法...... 我现在正在使用它,一切都很完美。

@Override
    protected void onCreate(Bundle savedInstanceState)

                             .......

          getSupportLoaderManager().initLoader(LOADER_ID, null, this);

                             .......
}

答案 2 :(得分:0)

在片段中的onActivityCreated(Bundle savedInstanceState)中调用它

getLoaderManager().initLoader(LOADER_ID, new Bundle(), this);

答案 3 :(得分:0)

如何在初始化加载器之前检查savedInstanceState。

if (savedInstanceState == null)
    getLoaderManager().initLoader(LOADER_ID, null, this);

答案 4 :(得分:0)

getLoaderManager 已弃用,使用 LoaderManager.getInstance(this).initLoader(0,null,this);

代替