在onLoadFinished CursorLoader回调中获取Bundle args

时间:2012-04-29 21:25:36

标签: android

当我用

启动游标加载器时
 Bundle bundle = new Bundle();
 bundle.putInt("arg", 123);
 getLoaderManager().restartLoader(0, bundle, this);

我想在

中获取捆绑包
 public void onLoadFinished(Loader<Cursor> loader, Cursor data)

但这似乎只能来自onCreateLoader(...)

我能想到的唯一解决方法是继承CursorLoader并添加一些字段以将数据加载到onLoadFinished(...)

谢谢!

2 个答案:

答案 0 :(得分:2)

我不会在实现LoaderCallbacks的类中使用私有成员字段,因为您永远不知道哪个加载器正在完成。最好像提问者建议并使用加载器存储数据。我是这样做的:

public static class CursorWithData<D> extends CursorWrapper {
  private final D mData;

  public CursorWithData(Cursor cursor, D data) {
    super(cursor);
    mData = data;
  }

  public D getData() {
    return mData;
  }
}

@Override
public Loader<Cursor> onCreateLoader(int id, final Bundle bundle) {
  // ...

  return new CursorLoader(getActivity(), uri, projection, selection, args, order) {
    @Override
    public Cursor loadInBackground() {
      return new CursorWithData<Bundle>(super.loadInBackground(), bundle);
    }
  };
}

@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
  CursorWithData<Bundle> cursorWithData = (CursorWithData<Bundle>) cursor;
  Bundle args = cursorWithData.getData();
  cursor = cursorWithData.getWrappedCursor(); // Optional if you are worried about performance

  // ...
}

答案 1 :(得分:0)

由于您使用'this'作为onLoadFinished的第三个参数,我假设该类正在实现LoaderManager.LoaderCallbacks接口。因此不需要参数,您可以使用私有成员字段。