2013-12-15 27 views
0

我有这个cursorAdapter为其定义一个新的对象。一旦声明了对象'itemAdapter',我就可以获得从bindView方法加载到数组(名称)中的所有字符串的名称。cursorAdapter加载后执行下一行代码

@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'(最后一行)命令。由于'名称'数组只填充了itemadapter声明后的值,logcat显示Names数组的大小为0.

我已经确认名称数组在声明itemAdapter后不会保持为空。

请帮忙!!!!

回答

0

你有几个错误的问题,在你的代码

  1. 严禁制作DB操作在onActivityResult

onActivityResult中的onResume之前运行 - 因此如果onActivityResult很慢,用户会看到一个黑色的屏幕一会儿(你想要吗?)

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

  2. 如果DB操作是异步发生的事情是

您启动异步请求

,代码会继续运行,并且有时当结果来临时,它被设置为适配器

为什么这个代码仍然可以正常工作是因为itemAdapter被保存在的原因内存,因为你的列表视图有一个引用它,一旦它更新(和林下的某个地方因为对itemAdapter的引用仍然存在,所以它会更新你的列表视图

如果你看看loader的回调函数(那些设计为异步加载游标的函数),这就是他们所做的

您创建一个空的光标适配器,当光标完成加载,你换你的光标

reference to loader callbacks