Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 游标适配器在执行下一行代码后加载_Android_Sqlite_Android Cursoradapter - Fatal编程技术网

Android 游标适配器在执行下一行代码后加载

Android 游标适配器在执行下一行代码后加载,android,sqlite,android-cursoradapter,Android,Sqlite,Android Cursoradapter,我有一个游标适配器,我为它定义了一个新对象。一旦声明了对象'itemAdapter',我就获得从bindView方法加载到数组中的所有字符串的名称(名称) 问题是系统在取消'itemAdapter'之前执行'log.d'(最后一行)命令。由于“Names”数组仅在声明itemAdapter后才填充值,因此logcat将Names数组的大小显示为0 我已经确认,一旦声明itemAdapter,names数组就不会保持为空 请帮忙 您的代码中有几个错误的问题 不要在onActivityResult中

我有一个游标适配器,我为它定义了一个新对象。一旦声明了对象'itemAdapter',我就获得从bindView方法加载到数组中的所有字符串的名称(名称)

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

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


请帮忙

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

  • 不要在onActivityResult中进行DB操作
  • onActivityResult在onResume之前运行-因此,如果onActivityResult运行缓慢,用户将看到一段时间的黑屏(您想要吗?)

  • 如果可能的话,DB操作应该是异步的,并带有回调,您可以在回调上设置适配器内的DB操作内容 也许在您的例子中,它们是异步的,因为您没有告诉我们“getItemCursor(-1)”的作用

  • 如果db操作是异步的,那么发生的是

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

    这段代码仍然可以工作的原因是itemAdapter被保存在内存中,因为listview有一个对它的引用,一旦它更新了(在下面的某个地方,您将使用notifyDataSetChanged),因为对itemAdapter的引用仍然存在,它将更新listview

    如果您查看一下加载器回调(设计用于异步加载游标的回调),它们就是这样做的

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

        @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()));
    
        }
    }