Обновить ListView после инициализации CursorAdapter - PullRequest
0 голосов
/ 11 августа 2011

У меня есть вкладки, которые содержат фрагменты для вкладок. На одной из вкладок отображается список данных из таблицы базы данных SQLite (или другой фрагмент, если таблица пуста). При первоначальном создании вкладок активность вкладок проверяет, содержит ли таблица какие-либо данные. Если это так, то он инициализирует фрагмент списка, но не устанавливает CursorAdapter. CursorAdapter инициализируется AsyncTask, который синхронизирует базу данных SQLite с центральной базой данных, а затем создает Cursors и CursorAdapters. Фрагмент списка отображает ProgressDialog при ожидании AsyncTask для создания CursorAdapter. Когда CurserAdapter инициализируется, ProgressDialog отклоняется, но ListView остается в своем представлении «пустой список», несмотря на вызовы notifyDataSetChanged (). Если я переключаю вкладки и возвращаюсь, ListView отображает данные правильно. Как я могу сделать обновление 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();         
    }
}

1 Ответ

0 голосов
/ 11 августа 2011

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

...