是的,它对我有效。我在导航抽屉中有3个不同的片段,在其中相同的数据填充到不同的ListView中。(所有片段都是同一活动的一部分)。
我的AsyncTaskLoader:
public class MyTaskLoader extends AsyncTaskLoader<HashMap<String, Integer>> {
public MyTaskLoader(Context context) {
super(context);
}
@Override
public HashMap<String, Integer> loadInBackground() {
...
return hashMap;
}
...
}
在所有片段中使用相同的加载器 ID。
片段1:
public class Fragment1 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> {
@Override
public void onCreate(Bundle savedInstanceState) {
getActivity().getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) {
return new MyTaskLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0,
HashMap<String, Integer> data) {
listAdapter.setData(data.keySet());
}
@Override
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) {
listAdapter.setData(null);
}
}
使用相同的ID作为Fragment2:
public class Fragment2 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> {
@Override
public void onCreate(Bundle savedInstanceState) {
getActivity().getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) {
return new MyTaskLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0,
HashMap<String, Integer> data) {
listAdapter.setData(data.keySet());
}
@Override
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) {
listAdapter.setData(null);
}
}
在初始化加载器之前,应该先初始化适配器。
目前为止还可以。
但是,这样做是否正确?有没有更好的方法来为多个Fragment使用公共加载器?
Fragment
和它的父Activity
中都引用Loader
吗?请记住,鼓励设计可重用的Fragment
...如果开始交织Activity
和Fragment
的显式行为,事情很快就会变得混乱...尽可能在每个类中单独完成尽可能多的工作,然后在适当时实现Activity
回调方法。 - Alex Lockwood