2011-01-23 1 views
1

Je souhaite afficher une vue de liste vide, qui est ensuite renseignée par l'utilisateur. J'ai le flot de l'interface utilisateur qui fonctionne, et je remplis une liste de mes objets personnalisés après que l'utilisateur entre certaines informations via une vue qui est invoquée via setContentView (c'est-à-dire, aucune nouvelle activité).Mettre à jour ListView à partir de l'entrée utilisateur après l'appel de setContentView

Je prends l'entrée et l'ajoute à une liste, que je veux résumer sur ListView. Cependant, chaque fois que j'ajoute à la liste et/ou ArrayAdapter et j'appelle adaptateur.notifyDataSetChanged() il ne fait pas ce que je veux. Le ListView est toujours vide. Argh! Ça me rend fou!

@Override 
public void onCreate(Bundle blah) { 
    ListView listView = (ListView) findViewById(R.id.results_list); 
    listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, list)); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.mnu_add: 
     final Activity act = this; 
     setContentView(R.layout.record_details);// the sub-view that takes the user input 
     // the button on the form to 'add' details:- 
     ((Button) findViewById(R.id.recored_details_add_btn)) 
     .setOnClickListener(
      new OnClickListener() { 
      public void onClick(View v) { 
        // get input from widgets 
        list.add(someObject); 
        ((ArrayAdapter<Object>) listView.getAdapter()).notifyDataSetChanged(); 
        setContentView(R.layout.list_view); 

       } 
      } 
     ); 
     ((ArrayAdapter<Object>) listView.getAdapter()).notifyDataSetChanged(); 
     break; 
    } 
    return true; 
} 

S'il vous plaît, sauvez-moi de ma misère et informez-moi de ma stupidité?

Merci d'avance.

Répondre

2
public void onClick(View v) { 
    // get input from widgets 
    list.add(someObject); 
    ((ArrayAdapter<Object>) listView.getAdapter()).notifyDataSetChanged(); 
    setContentView(R.layout.list_view); 

Est-il possible que ce setContentView dans le gestionnaire onClick crée une nouvelle instance de la vue de la liste widget (sans adaptateur) ou réinitialisant la vue de la liste (l'adaptateur de compensation)?

Essayez de mettre quelque chose dans la liste initialement dans onCreate et ensuite voir si elle disparaît lorsque vous appuyez sur le bouton.

Je n'ai vu aucun code (bien que je sois un débutant relatif) qui change de vue au cours de la vie de l'activité pour faire apparaître essentiellement différentes pages - la plupart utilisent une activité distincte.

Edit:

OP demande:

Merci ... Alors, comment puis-je obtenir ce que je veux? La liste avec laquelle je sauvegarde l'adaptateur est statique; devrais-je simplement utiliser des activités et compter sur onCreate loading à partir du champ statique?

Certaines options:

  1. Utiliser des activités séparées

  2. réassocier l'adaptateur (appel setAdapter nouveau) - probablement une mauvaise idée

  3. Déclarez les dispositions de la même fichier. Vous en cacherez un et afficherez l'autre pour passer d'une vue à l'autre et vous pourrez appeler le setContentView. Ceci est similaire à la façon dont la disposition ListView fonctionne (une pour quand la liste est vide et une pour quand elle ne l'est pas). Je pense que j'ai vu un exemple de cela quelque part sur le net, mais je n'ai pas de référence pour le moment.

+1

J'ai ajouté une instance de la même classe personnalisée dans onCreate qui est visible à la première vue (bien, le résultat de toString est visible), mais disparaît lorsque je clique sur le bouton Ajouter de la vue secondaire! –

+0

@atc - Je pense que cela confirme la théorie. Vous créez/réinitialisez l'affichage de la liste lorsque vous appelez 'setContentView()'. Indépendamment de cela, l'adaptateur n'est plus associé. Il pourrait y avoir d'autres effets secondaires pour appeler 'setContentView' plusieurs fois. –

+0

Merci ... Alors, comment puis-je obtenir ce que je veux? La liste avec laquelle je sauvegarde l'adaptateur est statique; devrais-je simplement utiliser des activités et compter sur onCreate loading à partir du champ statique? –

1

Vous pouvez relancer la même activité en utilisant Intent.FLAG_ACTIVITY_SINGLE_TOP drapeau tout en créant l'intention et remplacer la méthode onNewIntent().

A l'intérieur du onNewIntent(), vous créez l'adaptateur avec les données mises à jour et appelez setAdapter. Je pense que cela vous donnera le comportement voulu.

Questions connexes