2011-11-21 6 views
5

Hey j'utilise un listview pour démontrer les entrées qui sont stockées dans une base de données. J'ai aussi un élément EditText et un bouton qui ajoute le contenu de l'EditText dans la base de données. Pour lier la vue sur le contenu de la base de données que j'utilise la SimpleCursorAdapter et la fonction suivante Populate:Android ListView mise à jour avec SimpleCursorAdapter

private void populate() { 
    cursor = dbAdapter.getAllItems(); 
    startManagingCursor(cursor); 

    String[] from = new String[] { DBAdapter.KEY_TASK }; 
    int[] to = new int[] { android.R.id.text1 }; 

    // Now create an array adapter and set it to display using our row 
    cursorAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, from, to); 
    list.setAdapter(cursorAdapter); 
} 

Si j'ai ajouté une nouvelle entrée, en cliquant sur le bouton que je veux rafraîchir la listview mais cela fonctionne uniquement avec la fonction populate et non avec la fonction d'adaptateur commune notifyDataSetChanged();. Ai-je un bug ou est-ce la bonne façon de rafraîchir une liste?

Répondre

8

Avez-vous vu this, essayé la méthode swap cursor, ou essayé simplement en appelant à nouveau setAdapter()?

J'ai eu un problème similaire où je ne pouvais pas mettre ma liste à jour, et ce que j'ai fait était juste de créer une méthode refreshListView(). Maintenant, vous pouvez l'appeler initialement à partir de votre onCreate(), ET à chaque fois qu'un utilisateur ajoute quelque chose à la base de données. Tout ce qu'il fait est re-lier la listview à un curseur. Avec toutes les méthodes deprecating (requery()), et les problèmes avec notifyDataSetChanged(), j'ai décidé que c'était le moyen le plus simple.

+0

Juste pour mentionner: 'requery()' est déjà obsolète. [Documentation] (http://developer.android.com/reference/android/database/Cursor.html#requery()) a un dossier clair à ce sujet. – 87element

+0

Je sais, je n'ai pas tout à fait le mot correct, reformulé:> – Jack

+0

Hey Jack merci pour votre réponse, je vois que j'oublie de dire que le code ci-dessus est ma fonction 'populate()' je l'appelle dans ma méthode 'onCreate()' et si je clique sur le bouton "Ajouter". Je voulais seulement savoir si c'est une bonne solution d'appeler cette méthode au lieu d'appeler la méthode commune 'notifyDataSetChanged()' de la classe de l'adaptateur de base. –

2

S'il vous plaît se référer ce lien ... cela fonctionne comme un charme

Update SimpleCursorAdapter while maintaining scroll position in ListView

pour listview dynamique sur rouleau i ajouté nouvel élément de base de données .. je l'ai fait erreur ici .. i nouvel adaptateur a été l'attribution pour chaque fois pour le même simplecursoradapter. Au lieu de créer un nouvel adaptateur. il suffit d'utiliser

adapter.changecursor(newcursorValue); 
adapter.notifydatasetChanged(); 
lsMedicine1.setSelectionFromTop(lsMedicine1.getLastVisiblePosition()-20, 0); 
1

Vous devez appeler swapcursor() avant notifyDataSetChanged() sur l'adaptateur.

Questions connexes