2010-09-30 5 views
0

J'ai un problème avec la méthode onItemSelected de Spinner. Il n'y a pas de problème si je n'ai qu'un seul Spinner. Je peux définir un auditeur à ce sujet. J'ai une base de données stockée dans sqlite. Il existe une table dans laquelle un champ de colonne contient la date avec le format année-mois-date. Ensuite, j'ai créé deux vues Spinner. Un pour le mois et l'autre pour l'année. Mon programme veut montrer les requêtes de base de données basées sur la sélection du mois et de l'année.Est-il possible de créer deux "setOnItemSelectedListeners" sur Spinner?

Le problème maintenant, si je règle l'écouteur seulement le mois Spinner, il montre des requêtes basées sur le mois. Si je définis l'écouteur sur l'année Spinner, il affiche les requêtes basées sur l'année. En fait, j'ai déjà préparé des requêtes sql qui correspondent à la fois aux requêtes de l'année et du mois. Mais il semble que l'écouteur OnItemSelected ne peut accepter qu'une seule instance de spinner à la fois. J'essaie d'utiliser monthview.getItemAtPosition (position) & & yearview.getItemAtPosition (position) pour correspondre aux deux exigences pour le mois et l'année. Mais ça a échoué.

J'utilise public class xxx extends xxx implémente OnItemSelected listener et ajoute deux méthodes.

spinner.setOnItemSelectedListener(new OnItemSelectedListener() 
{ 
    @Override 
    public void onItemSelected(AdapterView<?> parent, 
      View view, int pos, long id) 
    { 
      // Do some stuff based onItemSelected 
      } 
} 

Est-ce que quelqu'un sait comment atteindre cet objectif? En deux mots, j'ai deux spins, un pour le mois, un pour l'année, les valeurs sont renseignées via arrayadapter. Ensuite, j'utilise SimpleCusrsorAdapter pour obtenir le résultat sql de sqlite DB. Ensuite, je mets le résultat du curseur dans listadapter et associé à listview. Cela fonctionne sans problème si je l'exploite individuellement soit par mois ou par an mais pas les deux. Mais il semble que l'auditeur écoute seulement sur une instance de spinner pas deux ou plus en même temps. Peut être que c'est un problème commun. Peut-être que certains d'entre vous ont déjà rencontré ce problème auparavant. Ou est-ce que je peux utiliser une classe interne anonyme? Mais je pense que c'est une approche différente avec le même résultat. Si non peut-être que je dois utiliser une autre technique si un seul auditeur est disponible?

Je veux montrer, par exemple: -I sélectionnez Avril et toutes les années, il affiche toutes les entrées en Avril (Avril dans toutes les années) -I sélectionnez 2010 et Tous les mois, il affiche toutes les entrées en 2010 (Jan à décembre 2010) -J'ai choisi avril et 2010, il affiche seulement toutes les entrées en avril 2010

Merci pour l'explication et les suggestions !!

Tom Cordialement,

Répondre

0

Enfin, je résolu ce problème en utilisant getSelectedItemPosition() pour obtenir la valeur et faire quelques vérifications de décision. Ensuite, le programme s'exécute sans problème.

Mais je veux aussi savoir si je peux utiliser plus de deux setOnItemSelectedListener pour Spinner ou un autre composant d'interface utilisateur?

Tom

0

Je ne suis pas 100% sûr que je reçois votre problème.

Regardez le nom de la méthode.

setOnItemSelectedListener 

La clé ici est le mis part. Chaque fois que vous appelez cette méthode, vous remplacez toutes les valeurs précédemment stockées pour cet objet.Mais dans vos cas, il semble que ce que vous devriez faire est d'appeler la méthode une fois pour chacun des deux filateurs soit avec une classe anonyme (comme vous le faites là) ou avec votre activité (ce qui économisera un peu de mémoire puisque vous n'avez pas à créer les deux classes).

À titre d'exemple:

spinner1.setOnItemSelectedListener(classToReceiveTheSelection) 
spinner2.setOnItemSelectedListener(classToReceiveTheSelection) 

Si vous devez absolument avoir deux classes différentes qui répondent à la même OnItemSelected, ce qui est possible, mais un peu laid.