【问题标题】:cursorAdapter loads after the next line of code is executedcursorAdapter 在下一行代码执行后加载
【发布时间】:2013-12-16 07:10:55
【问题描述】:

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

    @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 数组就不会保持为空。

请帮忙!!!!

【问题讨论】:

    标签: android sqlite android-cursoradapter


    【解决方案1】:

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

    1. 不要在 onActivityResult 中进行数据库操作

    onActivityResult 在 onResume 之前运行 - 因此如果 onActivityResult 很慢,用户会看到一段时间的黑屏(你想要吗?)

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

    2. 如果数据库操作是异步的,会发生什么

    您启动异步请求,代码继续运行,有时当结果出现时,它被设置到适配器

    此代码可能仍然有效的原因是因为 itemAdapter 被保存在内存中,因为您的列表视图具有对它的引用,一旦它更新(并且您将在某处使用 notifyDataSetChanged),因为对 itemAdapter 的引用仍然存在,它将更新您的列表视图

    如果您查看加载器回调(旨在异步加载游标的回调),它们就是这样做的

    你创建一个带有空光标的适配器,当光标完成加载时,你交换你的光标

    reference to loader callbacks

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-29
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多