0

我有一個選項卡活動,其中包含標籤的片段。其中一個選項卡顯示SQLite數據庫表中的數據列表(如果表爲空,則顯示不同的片段)。在最初創建選項卡時,選項卡活動將檢查該表是否包含任何數據。如果是這樣,那麼它會初始化Fragment列表,但不會設置CursorAdapter。 CursorAdapter由AsyncTask初始化,它將SQLite數據庫與中央數據庫同步,然後創建Cursors和CursorAdapters。列表Fragment在等待AsyncTask創建CursorAdapter時顯示ProgressDialog。當CurserAdapter被初始化時,儘管調用了notifyDataSetChanged(),但ProgressDialog被解除,但ListView仍然保留在其'空列表'視圖中。如果我切換標籤並返回,ListView將正確顯示數據。一旦CursorAdapter被初始化,我怎樣才能做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();   
    } 
} 

回答

0

你一個重新創建一個新的適配器,但我沒有看到任何代碼將適配器設置到列表中。由於該列表對您的全新適配器一無所知,因此撥打notifyDataSetChanged()不起作用。順便說一句,如果你已經在使用碎片,你可能會考慮使用Loader。

+0

嗨。對不起,我錯過了那一點。我已將它添加到FriendsList代碼中。我考慮過使用CursorLoader,但我沒有將數據庫設置爲ContentProvider,因爲它是私有數據庫。 – Pikaling

+0

這是否解決了您的問題?順便說一句,您可以輕鬆編寫一個支持您的自定義數據庫的Loader。只需複製CursorLoader源代碼並將ContentProvider部分替換爲您的自定義實現。以下是一個示例:http://code.google.com/p/wwwjdic/source/browse/branches/2.0/wwwjdic/src/org/nick/wwwjdic/history/HistoryLoaderBase.java –

+0

不,我沒有。我已經開始研究Loaders,看起來可能是解決方案,儘管我目前對它們感到困惑:-) – Pikaling