【问题标题】:Sprinkles inside fragment洒在碎片内
【发布时间】:2014-02-09 16:53:35
【问题描述】:

我有 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 仅一次。问题是为什么在方向改变后回调函数被调用的次数更多。

任何澄清此问题的帮助将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    最后我自己发现了问题,所以我把它作为答案。也许有人会需要它,因为我在 Sprinkle 的 GitHub 或 Google 上没有找到任何关于这件事的信息。

    如果你想在 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);
    

    【讨论】:

      猜你喜欢
      • 2013-08-14
      • 2010-10-26
      • 2018-09-25
      • 2012-12-11
      • 2011-01-17
      • 2012-01-18
      • 2020-02-15
      • 1970-01-01
      相关资源
      最近更新 更多