Android Spinner sélection
La OnItemSelectedListener gestionnaire d'événement est appelé à la fois quand un spinner
la sélection est modifiée par programmation, et lorsqu'un utilisateur physiquement clique sur le contrôle spinner.
Il est possible de déterminer si un événement a été déclenché par un utilisateur
sélection en quelque sorte?
Ou est-il un autre moyen de gérer spinner les sélections de l'utilisateur?
- Cela a fonctionné pour moi paramètre sélectionné avec runnable stackoverflow.com/a/13528576/1104279
Vous devez vous connecter pour publier un commentaire.
Pour contourner ce problème, vous devez vous souvenir de la dernière position sélectionnée. Ensuite, à l'intérieur de votre spinner auditeur de comparer à la dernière position sélectionnée avec le nouveau. Si elles sont différentes, alors le processus de l'événement et également mettre à jour la dernière position sélectionnée avec la nouvelle valeur de position, sinon, sautez simplement la manifestation de traitement.
Si quelque part dans le code que vous allez modifier par programmation spinner position sélectionnée et que vous ne voulez pas à l'auditeur de processus de l'événement, puis il suffit de réinitialiser la dernière de position sélectionné pour une vous allez définir.
Oui, Spinner Android est douloureux. J'irais même jusqu'à dire que la douleur commence à partir de son nom - "Spinner". N'est-il pas un peu trompeur? 🙂 Autant que on en parle, vous devez également être au courant il y a un bug Toupie ne peut pas restaurer (pas toujours), son état (sur l'appareil de rotation), alors assurez-vous de gérer Spinner de l'état manuellement.
Difficile de croire qu'un an et demi plus tard, le problème existe toujours et continue de boggle personnes...
J'ai pensé partager la solution m'est venu après la lecture de Arhimed le plus utile de la poste (merci, et je suis d'accord sur les filateurs être douloureux!). Ce que j'ai fait pour éviter ces faux positifs est d'utiliser un simple wrapper classe:
Tout ce qu'il fait est de piéger l'élément sélectionné les événements de la même position qui a été déjà sélectionné (par exemple, la première déclenchée automatiquement à la sélection pour la position 0), et de passer sur d'autres événements de la enveloppé auditeur. Pour l'utiliser, tout ce que vous avez à faire est de modifier la ligne dans votre code qui appelle à l'auditeur d'inclure l'emballage (et ajouter le crochet de fermeture, bien sûr), donc au lieu de dire:
vous auriez ceci:
Évidemment, une fois que vous avez testé, vous pourriez se débarrasser du Journal des appels, et vous pouvez ajouter la possibilité de réinitialiser la dernière position si nécessaire (vous auriez à garder une référence à l'instance, bien sûr, plutôt que de déclarer à la volée) comme Arhimed dit.
Espère que cela peut aider quelqu'un de fou par ce comportement étrange 😉
Dans le passé, j'ai fait ce genre de choses à distinguer
Puis dans la zone de texte de l'auditeur
J'utilise ++ et -- plutôt que de fixer une valeur booléenne "true", et que donc il n'y a pas de soucis quand les méthodes nid d'autres méthodes qui pourraient également définir le changement interne de l'indicateur.
J'ai eu cette situation, dernièrement, lors de l'utilisation de toupies et de l'internet n'est pas venu avec une solution adaptée.
Mon scénario d'application:
X toupies (dynamiquement, 2 pour chaque processeur, min & max) pour la mise en & affichage de la CPU Fréquence. Ils sont remplis lorsque l'application démarre et ils obtiennent également le courant max/min freq du cpu ensemble. Un thread s'exécute en arrière-plan et vérifie change à chaque seconde et met à jour les toupies en conséquence. Si une nouvelle fréquence à l'intérieur de la toupie est définie par l'utilisateur la nouvelle fréquence est définie.
Le problème est que le fil accessible setSelection pour mettre à jour la fréquence actuelle qui, à son tour appelé mon écouteur et je n'avais aucun moyen de savoir si c'était de l'utilisateur ou le thread qui a changé la valeur. Si c'était le fil, je ne voulais pas l'auditeur à être appelé, car il n'y aurait pas eu besoin de changer la fréquence.
Je suis venu avec une solution qui convient à mes besoins parfaitement et fonctionne autour de l'auditeur sur votre appel 🙂 (et je pense que cette solution vous donne maximum de contrôle)
J'ai étendu Spinner:
et créé mon propre OnItemSelectedListener:
Maintenant, si vous créez un MySpinner vous pouvez utiliser cette fonction pour définir la sélection:
setSelection(position, callListener);
Où callListener est vrai ou faux. La volonté véritable appel à l'auditeur et à l'est par défaut, c'est pourquoi les interactions de l'utilisateur sont arriver identifié, faux, aussi appel à l'auditeur, mais utilise le code que vous voulez, pour ce cas particulier, exempli gratia dans mon cas: Rien.
J'espère que quelqu'un d'autre le trouve utile et est épargné un long voyage pour voir si quelque chose comme cela existe déjà 🙂
Je cherche aussi une bonne solution sur internet mais n'ai pas trouvé qui satisfait mes besoins.
J'ai donc écrit cette extension sur le compteur de la classe de sorte que vous pouvez définir un simple OnItemClickListener, qui a le même comportement que d'un contrôle ListView.
Uniquement lorsqu'un élément se fait "sélectionnées", le onItemClickListener est appelé.
Avoir du plaisir avec elle!
Juste pour élargir sur aaamos du post ci-dessus, depuis je n'ai pas les 50 points de rep pour le commentaire, je suis entrain de créer un nouvel élément de réponse ici.
Fondamentalement, son code fonctionne pour le cas lors de la première Spinner sélection est de 0. Mais pour généraliser ce modèle, j'ai modifié son code de la manière suivante:
Fondamentalement, ce code va ignorer le premier tir de onItemSelected(), et puis tous les "même situation" appels.
Bien sûr, l'exigence est ici que la sélection est définie par programmation, mais qui devrait être le cas, de toute façon, si la position par défaut est de 0.
J'ai fait un peu de journalisation et a découvert qu'il ne se fait jamais appelé à initialiser, ce qui est ennuyeux. Ne pouvez pas voir le besoin pour tout ce code, je viens de créer une variable d'instance qui a été initialisé à un agent de la valeur, puis après la méthode a été appelée la première fois.
Je me suis connecté lorsque le onItemSelected méthode a été appelée, il a été autrement que d'être appelé qu'une seule fois.
J'ai eu un problème où il était de créer deux de quelque chose, et réalisé que c'était parce que j'étais l'appel de la méthode add() sur mon adaptateur personnalisé, qui avait déjà une référence à la liste, j'ai été référencement et avait ajouté à l'extérieur de la carte. Après j'ai réalisé ceci et retiré de la méthode add le problème a disparu.
Vous êtes sûr que vous avez besoin de tous ce code?
Je sais que c'est assez tard, mais j'ai trouvé une solution très simple à ce. Il est basé sur Arhimed réponse, c'est exactement la même. Il est très facile à mettre en œuvre aussi. Reportez-vous à la accepté de répondre:
Indésirables onItemSelected appels