执行下一行代码后,cursorAdapter加载

时间:2013-12-15 20:35:29

标签: android sqlite android-cursoradapter

我有这个cursorAdapter,我为其定义了一个新对象。一旦声明了对象'itemAdapter',我就会得到从bindView方法加载到数组中的所有字符串的名称(Names)。

    @Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
    // TODO Auto-generated method stub
    Log.d("success", "On activity result");
    super.onActivityResult(arg0, arg1, arg2);
    if(arg1==RESULT_OK){
        db=new DatabaseControl(this);
        db.open();
        CategoryCursorAdapter itemAdapter=new CategoryCursorAdapter(this, db.getItemCursor(-1), CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER, "item_name",1,db);
        iFrag.getListView().setAdapter(itemAdapter);

        Log.d("success", String.valueOf(itemAdapter.Names.size()));

    }
}

问题是系统在'itemAdapter'的解除之前执行'log.d'(最后一行)命令。由于'Names'数组仅在声明itemAdapter后填充值,因此logcat将Names数组的大小显示为0。

我已经确认,一旦声明了itemAdapter,names数组就不会为空。

请帮助!!!!

1 个答案:

答案 0 :(得分:0)

您的代码中有几个错误的问题

  1. 请勿在onActivityResult中进行数据库操作
  2. onActivityResult在onResume之前运行 - 因此如果onActivityResult很慢,用户会看到黑屏一段时间(你想要吗?)

    1. 如果可能,数据库操作应该是异步的,带有回调,您可以在其中设置适配器内的内容 也许在你的情况下,它们是异步的,因为你没有告诉我们“getItemCursor(-1)”是什么

    2. 如果db操作是异步的,那么

    3. 启动异步请求,代码继续运行,有时候结果出现,它会被设置为适配器

      这个代码可能仍然有用的原因是因为itemAdapter被保存在内存中,因为你的listview有一个对它的引用,一旦它更新(以及你将使用notifyDataSetChanged的某个地方),因为对itemAdapter的引用仍然存在,它将更新您的列表视图

      如果你看看加载器回调(那些旨在异步加载游标的回调),这就是他们做的事情

      使用空游标创建适配器,当光标加载完毕后,交换光标

      reference to loader callbacks