洒在片段里面

时间:2014-02-08 17:16:11

标签: android android-fragments android-listfragment android-cursor

我有ListFragment(来自支持包),我正在尝试使用Sprinkles库(CursorList)的适配器。一切正常,直到我改变屏幕方向。然后我得到例外:

java.lang.IllegalStateException:尝试重新打开已经关闭的对象:SQLiteQuery:select * from MyTable

我的灵感来自github(https://github.com/emilsjolander/sprinkles/tree/master/sample)上的示例应用程序。

样本查询在Activity中的onCreate函数中注册,我在ListFragment中的onAttach函数中注册。

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    ...
    ...

    adapter = new MyAdapter(getActivity());
    Query.many(MyClass.class, "select * from myTable")
         .getAsync(getLoaderManager(), onMyClassLoaded, MyClass.class);
}

我的回调与样本一致。

private ManyQuery.ResultHandler<MyClass> onMyClassLoaded =
        new ManyQuery.ResultHandler<MyClass>() {

            @Override
            public boolean handleResult(CursorList<MyClass> result) {
                adapter.swapCursorList(result);
                return true;
            }
        };

我调整了方向更改后的内容,并且调用onMyClassLoaded两次调用(有时甚至更多次),但首次创建适配器调用onMyClassLoaded只有一次。问题是为什么在方向改变后调用回调函数的次数。

非常感谢任何澄清此问题的帮助!

1 个答案:

答案 0 :(得分:0)

最后我发现了问题,所以我给出了答案。也许有人会需要它,因为我在Sprinkle的GitHub或谷歌上找不到任何关于此事的内容。

如果你想在Fragment中使用Sprinkles,那么你必须改变一点查询。

而不是

Query.many(MyClass.class, "select * from myTable")
     .getAsync(getLoaderManager(), onMyClassLoaded, MyClass.class);

从您的活动中使用LoaderManager。

就我而言:

Query.many(MyClass.class, "select * from myTable")
     .getAsync(getActivity().getSupportLoaderManager(), onMyClassLoaded, MyClass.class);