Comment faire pour désactiver onItemSelectedListener être invoquée lors du réglage de l'élément sélectionné par le code
Demandais juste la façon dont vous gérer le problème suivant: un résultat est calculé en fonction de deux roulettes' éléments sélectionnés. Pour gérer l'INTERFACE utilisateur de choses, c'est à dire un utilisateur sélectionne un élément dans l'une des filateurs, j'ai installer un écouteur à l'aide de setOnItemSelectedListener
pour le spinner dans mon onCreate()
méthode de l'activité.
Maintenant: qui fonctionne, bien sûr, très bien. L'auditeur du travail est de déclencher un nouveau calcul du résultat.
Le problème: parce que je l'intercepter onPause()
onResume()
pour sauvegarder/restaurer le dernier état, j'ai une méthode qui jeux de ces deux toupies élément sélectionné par programme comme ici:
startSpinner.setSelection(pStart);
destSpinner.setSelection(pDest);
Ces deux appels appeler les auditeurs, trop! Ma méthode de calcul pour le résultat, en plus de la notification d'un nouveau jeu de résultats est appelée deux fois ici!
Un stupide direct pour cette approche serait d'avoir une variable booléenne désactivation ce que l'auditeur n'a à l'intérieur, le mettre en avant de régler les éléments sélectionnés et de le rétablir par la suite.
Ok. Mais est-il une meilleure méthode??
Je ne veux pas que les auditeurs à être appelée par le code - actions, que par les actions de l'utilisateur! 🙁
Comment voulez-vous faire?
Merci!
- Vous pouvez utiliser setSelection(pStart, false) pour animer param. Mais ça ne marche pas tout le temps.
Vous devez vous connecter pour publier un commentaire.
J'ai plus facile, et je pense que la meilleure solution. Depuis que j'ai eu pour actualiser les fileuses, même après l'initialisation, c'est une approche plus générique.
Veuillez vous référer à la accepté de répondre:
Indésirables onItemSelected appels
Une solution plus propre, à mon avis, de faire la différence entre la programmation et l'initiative de l'utilisateur change est le suivant:
Créer votre écouteur pour l'essoreuse à la fois comme un OnTouchListener et OnItemSelectedListener
Ajouter l'écouteur pour le compteur de l'inscription pour les deux types d'événements
De cette façon, tous les imprévus appels à votre méthode de gestionnaire en raison de l'initialisation ou de la ré-initialisation est ignorée.
Ok, j'ai eu de travail de la façon que je veux maintenant.
La chose à comprendre ici (et je n'ai pas quand j'ai écrit cette question...), c'est que tout dans Android s'exécute dans un thread, le thread d'INTERFACE utilisateur.
Sens: même si vous définissez Spinner valeurs ici et là: ils ne sont mises à jour (visuellement) et leurs auditeurs ne sont appelés après toutes les méthodes que vous vivez actuellement (comme
onCreate
,onResume
ou quoi que ce soit) sont finis.Cela permet à l'suivantes:
currentPos1
,currentPos2
)onItemSelectedListener()
appeler une méthode commerefreshMyResult()
ou quoi que ce soit.La
refreshMyResult()
méthode ressemble à ceci:Parce que les auditeurs sera appelé plus tard - et d'ici là, il se souvint de la position dans currentPos est déjà mis à jour - il ne se passera rien et ne nécessite pas de mise à jour de quoi que ce soit d'autre prendra la place.
Lorsqu'un utilisateur sélectionne une nouvelle valeur dans l'une des filateurs, bien que la mise à jour sera effectuée en conséquence!
Que c'est! 🙂
Ahh - une chose de plus: la réponse à ma question est: Non.
Les auditeurs ne peuvent pas être désactivés (facilement) et sera appelé à chaque fois qu'une valeur est modifiée.
D'abord ajouter des valeurs booléennes pour l'arrêt de spinner auditeur appel
Puis vous ajoutez à Toucher l'auditeur et sur l'Élément, cliquez sur l'Auditeur Comme le code ci-dessous
Son simple bon travail pour l'arrêt d'appel de serveur plusieurs fois.
Il est très facile, vous pouvez appeler le
Spinner.setSelection(int position, boolean animate)
méthode avecfalse
de sorte que les auditeurs ne réagira pas à la changer.Spinner.setSelection(int, boolean animer) ne déclencher l'auditeur sur 4,3
J'ai créé une bibliothèque qui aide à tous, pas besoin d'appeler l'élément action onClick dans Spinner
Par exemple:
où withAction est un indicateur booléen, qui est utilisée pour appeler ou pas d'élément d'action
Lien sur Github:
https://github.com/scijoker/spinner2
Ajouter le
OnItemSelectedListener
pour chaque spinner après vous avez défini une valeur précédente dans laonResume
.setOnItemSelectedListener(null)
avant de définir les valeurs et la restauration de la des auditeurs plus tard: sans tous effet! Les auditeurs sont appelés de manière asynchrone! 🙁Quand Spinner.setSelection () est utilisé, il est toujours active setOnItemSelectedListener()
Pour éviter de tir le code deux fois, j'ai utiliser cette solution:
Cette solution est valable que si vous êtes sûr que Spinner.setSelection(position) nous a habitués. Aussi, il est important de définir mIsSpinnerFirstCall=true à chaque fois avant d'utiliser Spinner.setSelection(position)
Ma solution est très simple. Tout d'abord initialiser un mondial variable booléenne.
Puis utilisez code ci-dessous dans votre onCreate() de la méthode.
Maintenant, vous pouvez utiliser le setSelection méthode de partout, sans invoquer la onItemSelected() la méthode par code ci-dessous.