2010-12-15 86 views
1

J'ai une listview et mon implémentation du CursorAdapter. En tant que partie de mon article de liste, j'ai un bouton de suppression. Lorsque l'utilisateur appuie sur le bouton , une boîte de dialogue s'affiche pour demander confirmation et si l'utilisateur appuie sur , je supprime l'élément de la base de données. Le problème est avec rafraîchissement la listview. J'ai essayé d'appeler cursor.requery() et mAdapter.notifyDataSetChanged() (séparément ou les deux) mais cela ne aide pas . La requête efface la liste et elle réapparaît (sans l'élément manquant) après avoir réintégré l'activité. notifyDataSetChanged fait rien (l'article est toujours sur la liste) et encore une fois il est OK après entrant dans l'activité. J'ai réussi à faire ce travail après rechargeant la base entière:Problème avec rafraîchir listview à partir d'une boîte de dialogue

//in the dialog: 
{ 
DBAdapter db = new DBAdapter(getApplicationContext()); 
db.open(); 

db.deleteTitle(rowid); 

db.close(); 

//cursor.requery(); 
//mAdapter.notifyDataSetChanged(); 

fillData(); 
} 


private void fillData() { 

       try{ 
       db.open(); 
       cursor = db.getAllTitles(); 
       startManagingCursor(cursor); 

       mAdapter = new MyIDsListCursorAdapters(this, R.layout.myidsrow, 
cursor, columns, to); 

       setListAdapter(mAdapter); 
       db.close(); 
      }catch (SQLException e){ 
       showDatabaseErrorDialog(); 
      } 
     } 

Mais rechargeant l'ensemble db semble être une tâche très cher et je suis tout à fait sûr qu'il doit y avoir une meilleure façon de le faire.

J'ai aussi un autre problème - mes articles listview sont définis par un relativelayout. Cependant, la disposition semble ignorer tous les attributs 'verticaux', comme alignParentBottom ou centerVertical. J'ai vu un google I/O avec Romain Guy et il a répondu à une question similaire par disant que nous devrions passer le parent ViewGroup suivi de false, à la fonction gonfler, mais cela ne résout toujours pas mon problème. Je ne sais pas ce qui se passe ici. J'ai résolu ceci en plaçant mes articles ci-dessous certains autres et en jouant avec la marge/remplissage mais je n'aime pas vraiment cette solution.

+0

Pouvez-vous publier votre implémentation d'adaptateur ici. – Vivek

Répondre

0

La requery est obsolète. Dans ma mise en œuvre, je recrée simplement le curseur, ce qui semble fonctionner. Voici mes bits de code. Dans mon cas, j'utilise un menu contextuel pour marquer un élément dans une liste, mais l'approche de base devrait fonctionner pour vous.

private Cursor fetchCursor(){ 
    Intent intent = getIntent(); 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String query = intent.getStringExtra(SearchManager.QUERY); 
     return mDbHelper.fetchSpellSearch(query); 
    } else { 
     return mDbHelper.fetchAllSpells(); 
    } 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
    switch (item.getItemId()) { 
     case 0: 
      mDbHelper.updateFavorite(info.id, 1); 
      new bgRequery().execute(); 
      return true; 
     case 1: 
      mDbHelper.updateFavorite(info.id, 0); 
      new bgRequery().execute(); 
      return true; 
     default: 
      return super.onContextItemSelected(item); 
     } 
} 

private class bgRequery extends AsyncTask<Void, Integer, Void> { 
    @Override 
    protected Void doInBackground(Void... voids) { 
     mSpellCursor = fetchCursor(); 
     return null; 
    }