2010-11-26 6 views
0

Je travaille avec Spinner, curseurs et adaptateurs. Je veux configurer un écouteur de clic pour le spinner de sorte que, une fois qu'un utilisateur sélectionne un élément du spinner, il obtienne l'élément sélectionné en cours, puis réalise d'autres tâches (tout ce code supplémentaire est bien, son juste 1 problème Je l'ai) ... Cela fonctionne cependant, une fois que je déclare le rappel setOnItemSelectedListener, puisque le curseur a déjà été rempli, l'événement est déclenché dès le lancement de l'application.Android spinner "onclicklistener" question

Je suppose que j'ai besoin d'un moyen de définir le curseur sans sélectionner un élément initial afin que l'événement ne se déclenche pas (car un élément ne sera pas sélectionné). Ou y a-t-il un autre meilleur moyen d'y parvenir?

Fondamentalement, en l'état, une fois que l'application charge la fonction setOnItemSelectedListener se déclenche parce que le curseur est peuplé (je pense). De plus, en ignorant le fait que l'événement est en train de se déclencher trop tôt, si je sélectionne alors le même objet dans le spinner, il ne déclenche pas l'événement car l'élément n'a pas changé. Dois-je utiliser un callback différent au lieu de setonitemslectedlistener? Voici le code que j'ai jusqu'ici.

  c = db.getallrecents(); 
    startManagingCursor(c); 

    busnumspinner = (Spinner) findViewById(R.id.Spinner01); 

     SimpleCursorAdapter spinneradapter = new SimpleCursorAdapter(this, 
       R.layout.lvlayout, c, spincol, spinto); 

    busnumspinner.setAdapter(spinneradapter); 


    busnumspinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { 
      String spinnerString = null; 
      Cursor cc = (Cursor)(busnumspinner.getSelectedItem()); 
      if (cc != null) { 
       spinnerString = cc.getString(
        cc.getColumnIndex("busnum")); 
       text = spinnerString; 
      } 

      showDialog(DATE_DIALOG_ID); 

     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parentView) { 
      // your code here 
     } 
    }); 
+0

J'ai modifié ma réponse, j'espère que cela aide – Javi

Répondre

3

Ceci a déjà été discuté dans ce question. Regardez là, même si elle a une réponse similaire à celle donnée par aveugle.

EDIT:

Si le onItemSelectedListener ne se déclenche pas lorsque vous en avez besoin, vous avez probablement besoin d'un onClickListener dans eachtext élément du droplist et obtenez là la position actuelle de l'élément sélectionné de la centrifugeuse. Le problème est que comme il est dit here spinner ne supporte pas cet événement, mais peut-être que vous pouvez l'obtenir en faisant quelque chose de similaire à l'expliqué dans ce stackoverflow question. Je ne l'ai pas essayé, donc je ne suis pas sûr que ça marchera.

+0

en effet javi, en utilisant un booléen permettrait d'arrêter l'événement de tir pour la première fois. mais comment est-ce que je peux adresser mon deuxième problème de l'événement ne tirant pas si je choisis le même article dans le fileur pour une deuxième fois? tous les conseils sont les bienvenus – brux

+0

ok c'est utile merci javi. mais pour être honnête, je vais retravailler l'interface utilisateur afin de contourner ce problème pour l'instant. – brux

+0

@brux bonne idée – Javi

2

Utilisez un drapeau booléen d'ignorer la première fois il est sélectionné par le système, ce ne est pas une solution assez, mais je l'ai eu du mal avec ce deux ou trois fois, et n'a jamais trouvé une meilleure solution.

+1

il contourne un de mes problèmes, à savoir le problème de l'événement mise à feu une fois que le rappel est défini, mais il est toujours le problème de ne jamais être en mesure de déclencher l'événement si le même élément dans le spinner est sélectionné:/ – brux

+0

Personnellement, je n'ai pas trouvé de solution à ce problème, désolé. Je viens de retravailler la logique derrière l'interface utilisateur. Peut-être ajouter un bouton? Si quelqu'un a une solution à ce problème, cela m'aidera énormément. – blindstuff

+0

ok merci blindstuff, je vais retravailler l'interface utilisateur mais la solution fournie par javi fonctionnerait je vous donne du pouce de toute façon! merci – brux

1

vous pouvez ajouter premier élément de spinner par valeur par défaut comme selectvalues ​​et vérifier sa position dans l'auditeur onitemselected, si elle est position zéro alors n'entrer dans la boucle supérieure à 0 puis entrez dans la méthode

voir l'exemple

busnumspinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int 
    position, long id) { 
    if(position!=0) 
    { 
     String spinnerString = null; 
     Cursor cc = (Cursor)(busnumspinner.getSelectedItem()); 
     if (cc != null) { 
      spinnerString = cc.getString(
       cc.getColumnIndex("busnum")); 
      text = spinnerString; 
     } 
     } 

    So this is not run the default value 
0

Essayez ceci:

Prolongez votre SimpleCursorAdapter, passer outre Bindview() et définir OnClickListener pour la vue de la ligne.

Cela surmonter les problèmes: Vous ne recevez pas l'appel initial, et vous obtenez chaque clic de sélection (inc re-sélection.)

Faites-moi savoir si vous avez besoin exemple de code.

EDIT: Exemple de code:

protected class NoteAdapter extends SimpleCursorAdapter { 

    // Constructor 
    public NoteAdapter(Context context, Cursor c) { 
     super(context, R.layout.etb_items_strip_list_item, c, fromNote, toNote); 
    } 


    // This is where the actual binding of a cursor to view happens 
    @Override 
    public void bindView(View row, Context context, Cursor cursor) { 
     super.bindView(row, context, cursor); 

     // Save id 
     Long id = cursor.getLong(cursor.getColumnIndex("_id")); 
     row.setTag(id); 

     // Set callback 
     row.setOnClickListener(row_OnClick); 
    } 

    // Callback: Item Click 
    OnClickListener row_OnClick = new OnClickListener(){ 
     public void onClick(View v) { 
      Long id = (Long) v.getTag(); 
     } 
    }; 

} 
+0

OferR pouvez-vous s'il vous plaît me fournir un peu de code ... –