3 votes

L'API Android ListView ne se met pas à jour lorsque vous utilisez notifyDataSetChanged() ;

Je suis désolé d'écrire sur ce qui semble être un problème courant, mais je suis déjà sur cette tâche depuis cinq heures, et j'abandonne tout simplement.

Je suis en train de créer une petite application Android, tout ce qu'elle est censée faire pour le moment est de conserver une petite base de données SQLite et d'être capable d'écrire/éditer des notes dessus. Tout fonctionne bien avec SQL, mon problème est avec le ListView. Quoi que je fasse, elle refuse de se mettre à jour lorsque j'ajoute une nouvelle note. La seule façon d'afficher la nouvelle note est d'entrer en mode édition dans un autre mode et d'en ressortir.

Voici la partie pertinente de la source :

public class MainActivity extends Activity {

ArrayAdapter<NoteItem> mAdapter;
public static NoteDataBase ndb;
ListView listView;
ArrayList a;

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ndb = new NoteDataBase(this);
    a = ndb.getAllNotes();

            //LISTVIEW DO NOT TOUCH
/***********/   mAdapter = new ArrayAdapter<NoteItem>(this, 
/***********/       android.R.layout.simple_list_item_1, a);
/***********/       listView = (ListView) findViewById(R.id.listView1);
/***********/   listView.setAdapter(mAdapter);
            //*****************

}

//New Note button
public void newNoteAction(View view){
    ndb.addNote(new NoteItem("Title", "Contents"));
    a = ndb.getAllNotes();
    mAdapter = new ArrayAdapter<NoteItem>
                                (this, android.R.layout.simple_list_item_1, a);
    mAdapter.notifyDataSetChanged();
    System.out.println(ndb.getAllNotes().size());
}

L'impression à la fin est juste pour voir si la nouvelle note est effectivement créée.

J'espère avoir donné assez d'informations, dites-moi si vous avez besoin d'autre chose. J'ai essayé presque tout ce que j'ai déjà lu, mais après presque cinq heures sur une tâche, il y a un moment où je vais devenir fou :)

Merci,

Shef

3voto

Aprian Points 1718
public void newNoteAction(View view){
    ndb.addNote(new NoteItem("Title", "Contents"));
    // don't do this
    // you are creating a new adapter and not binding it back to listview
    // a = ndb.getAllNotes(); 
    // mAdapter = new ArrayAdapter<NoteItem>(this, android.R.layout.simple_list_item_1, a);
    mAdapter.add(new NoteItem("Title", "Contents"));
    mAdapter.notifyDataSetChanged();
    System.out.println(ndb.getAllNotes().size());
}

1voto

Scott Stanchfield Points 15863

Il semblerait que le problème soit que vous créez une nouvelle instance de ArrayAdapter et de s'y ajouter, ce qui n'est pas associé à la ListView .

notifyDataSetChanged() enverra des événements à ce qui est à l'écoute - le ListView est à l'écoute de l'ancien adaptateur.

0voto

Akash Points 462

Il semble que vous vouliez mettre à jour l'adaptateur mais qu'au lieu de cela vous créez un nouvel adaptateur. Ici, si vous appelez juste listView.setAdapter(mAdapter) à nouveau, il définira ce nouvel adaptateur comme étant le ListView et ça marcherait.

Mais créer un nouvel adaptateur à chaque fois n'est pas un bon moyen de le faire. Puisque vous utilisez une base de données, essayez de lire les documents suivants Adaptateur de curseur .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X