初始化CursorAdapter后更新ListView

我有一个选项卡活动,其中包含标签的片段。 其中一个选项卡显示SQLite数据库表中的数据列表(如果表为空,则显示不同的片段)。 在最初创建选项卡时,选项卡活动将检查该表是否包含任何数据。 如果是这样,那么它会初始化Fragment列表,但不会设置CursorAdapter。 CursorAdapter由AsyncTask初始化,它将SQLite数据库与中央数据库同步,然后创建Cursors和CursorAdapters。 列表Fragment在等待AsyncTask创建CursorAdapter时显示ProgressDialog。 当CurserAdapter被初始化时,尽管调用了notifyDataSetChanged(),但ProgressDialog被解除,但ListView仍然保留在其'空列表'视图中。 如果我切换标签并返回,ListView将正确显示数据。 一旦CursorAdapter被初始化,我怎样才能做ListView更新?

相关的代码位:

标签:

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

您正在创建一个新的适配器,但我没有看到任何代码将适配器设置为列表。 由于该列表对您的全新适配器一无所知,因此调用notifyDataSetChanged()不起作用。 顺便说一句,如果你已经在使用碎片,你可能会考虑使用Loader。

链接地址: http://www.djcxy.com/p/64587.html

上一篇: Update ListView after initialising CursorAdapter

下一篇: AsyncTask Android example