0

У меня есть активность вкладок, которая содержит фрагменты для вкладок. На одной из вкладок отображается список данных из таблицы данных SQLite (или другой фрагмент, если таблица пуста). При первоначальном создании вкладок активность вкладок проверяет, содержит ли таблица какие-либо данные. Если это так, то он инициализирует фрагмент списка, но не настраивает CursorAdapter. CursorAdapter инициализируется AsyncTask, который синхронизирует базу данных SQLite с центральной базой данных, а затем создает курсоры и курсорные адаптеры. В списке Fragment отображается ProgressDialog, ожидая, пока AsyncTask создаст CursorAdapter. Когда инициализируется CurserAdapter, ProgressDialog отклоняется, но ListView остается в представлении «пустой список», несмотря на вызовы notifyDataSetChanged(). Если я переключу вкладки и вернусь, ListView отобразит данные правильно. Как я могу создать обновление ListView после инициализации CursorAdapter?Update ListView после инициализации CursorAdapter

Соответствующие биты кода:

Вкладки:

private static ImageCursorAdapter friendCursorAdapter = null; 

public static ImageCursorAdapter getFriendsListAdapter() { 
    return friendCursorAdapter; 
} 

public static void setFriendsListAdapter(ImageCursorAdapter adapter) { 
    friendCursorAdapter = adapter; 
    friendCursorAdapter.notifyDataSetChanged(); 
} 

SyncTask:

protected Void doInBackground(Void... params) { 
    sql = "SELECT COUNT(*) FROM " + WhereWolfOpenHelper.FRIEND_TABLE_NAME; 
    statement = db.compileStatement(sql); 
    count = statement.simpleQueryForLong();   
    if(count>0) { 
     friendCursor = db.query(WhereWolfOpenHelper.FRIEND_TABLE_NAME, null, null, null, null, null, WhereWolfOpenHelper.FRIEND_FIRST_NAME_COLUMN+", "+WhereWolfOpenHelper.FRIEND_LAST_NAME_COLUMN); 
    } 
    statement.close(); 
} 

@Override 
protected void onPostExecute(Void param) { 
    if(friendCursor!=null) { 
     ImageCursorAdapter adapter = new ImageCursorAdapter(WhereWolfActivity.this, friendCursor, 0, ImageCursorAdapter.FRIENDS); 
     Tabs.setFriendsListAdapter(adapter); 
    } 
} 

FriendsList:

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    setListAdapter(Tabs.getFriendsListAdapter()); 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    if(Tabs.getFriendsListAdapter()==null) { 
     final ProgressDialog dialog = ProgressDialog.show(getActivity(), getString(R.string.loadingtitle), getString(R.string.loading), true, false); 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while(Tabs.getFriendsListAdapter()==null) {} 
       dialog.dismiss();    
       Tabs.getFriendsListAdapter().notifyDataSetChanged(); 
      } 
     }); 
     thread.start();   
    } 
} 

ответ

0

Вы re создать новый адаптер, но я не вижу никакого кода для установки адаптера в список. Поскольку список ничего не знает о вашем новом адаптере, вызов notifyDataSetChanged() не помогает. Кстати, если вы уже используете фрагменты, вы можете использовать Loader.

+0

Hi. Извините, я пропустил это. Я добавил его в код FriendsList. Я рассматривал использование CursorLoader, но у меня нет базы данных, настроенной как ContentProvider, так как это частная база данных. – Pikaling

+0

Это решило вашу проблему? BTW, вы можете легко написать загрузчик, который поддерживает вашу собственную базу данных. Просто скопируйте исходный код CursorLoader и замените часть ContentProvider своей пользовательской реализацией. Вот пример: http://code.google.com/p/wwwjdic/source/browse/branches/2.0/wwwjdic/src/org/nick/wwwjdic/history/HistoryLoaderBase.java –

+0

Нет, я этого не сделал. Я начал смотреть в Loaders и, похоже, это может быть решением, хотя я в настоящее время их смущен :-) – Pikaling

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