0

J'ai une activité Onglets qui contient des fragments pour les onglets. L'un des onglets affiche une liste de données provenant d'une table de base de données SQLite (ou un fragment différent si la table est vide). Lors de la création initiale des onglets, l'activité des onglets vérifie si la table contient des données. Si c'est le cas, il initialise la liste Fragment mais ne configure pas le CursorAdapter. Le CursorAdapter est initialisé par un AsyncTask qui synchronise la base de données SQLite avec une base de données centrale, puis crée les Cursors et CursorAdapters. La liste Fragment affiche un ProgressDialog en attendant que la tâche AsyncTask crée le CursorAdapter. Lorsque le CurserAdapter est initialisé, le ProgressDialog est rejeté mais le ListView reste dans sa vue "liste vide", malgré les appels à notifyDataSetChanged(). Si je change d'onglet et reviens, le ListView affiche les données correctement. Comment puis-je faire la mise à jour ListView une fois que le CursorAdapter a été initialisé?Mettre à jour ListView après l'initialisation CursorAdapter

Bits importants de code:

onglets:

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

Répondre

0

-vous un re créer un nouvel adaptateur, mais je ne vois aucun code pour définir l'adaptateur à la liste. Depuis la liste ne sait rien à propos de votre nouvel adaptateur, l'appel notifyDataSetChanged() n'aide pas. BTW, si vous utilisez déjà des fragments, vous pourriez envisager d'utiliser un chargeur.

+0

Salut. Désolé, j'ai raté ce morceau. Je l'ai ajouté au code FriendsList. J'ai envisagé d'utiliser un CursorLoader mais je n'ai pas la base de données configurée comme ContentProvider car c'est une base de données privée. – Pikaling

+0

Est-ce que cela a résolu votre problème? BTW, vous pouvez facilement écrire un chargeur qui prend en charge votre base de données personnalisée. Copiez simplement le code source de CursorLoader et remplacez la partie ContentProvider par votre implémentation personnalisée. Voici un exemple: http://code.google.com/p/wwwjdic/source/browse/branches/2.0/wwwjdic/src/org/nick/wwwjdic/history/HistoryLoaderBase.java –

+0

Non, je ne l'ai pas fait. J'ai commencé à regarder dans Loaders et ressemble à cela pourrait être la solution, bien que je suis actuellement confus par eux :-) – Pikaling

Questions connexes