2013-12-15 3 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())); 

    } 
} 

Проблема заключается в том, что система выполняет «log.d» (последняя строка) команду перед decleration из «itemAdapter». Поскольку массив «Имена» заполняется только после того, как itemAdapter был объявлен, логарифм показывает размер массива имен как 0.

Я подтвердил, что массив имен не остается пустым после объявления элемента itemAdapter.

, пожалуйста, помогите !!!!

ответ

0

У вас есть несколько неправильных вопросов в коде

  1. НЕ ДЕЛАТЬ DB ОПЕРАЦИИ в onActivityResult

onActivityResult запускается перед onResume - таким образом, если onActivityResult медленно, пользователь увидит черный на какое-то время (вы хотите?)

  1. Операции с БД должны быть асинхронными, если возможно, с обратным вызовом, на которые вы можете установить ее содержимое внутри адаптера возможно в вашем случае они asynchornous, так как вы не сказали нам, что «getItemCursor (-1)» делает

  2. если операция дб является асинхронным, что происходит,

запуск запроса асинхронного, код продолжает работать, а иногда, когда результат приходит, он получает набор к адаптеру

причины, почему этот код все еще может работать, потому что itemAdapter получает хранятся в память, так как ваш список имеет ссылку на него, как только он обновляется (и где-то вниз по lin e вы будете использовать notifyDataSetChanged), так как ссылка на элементAdapter все еще существует, он обновит ваш список просмотров

, если вы посмотрите на обратные вызовы загрузчика (те, которые предназначены для загрузки курсоров асинхронно), это то, что они делают

создать адаптер с нулевым курсором, а когда курсор завершения загрузки, вы переставить курсор

reference to loader callbacks

Смежные вопросы