Comment puis-je faire quelque chose, de 0,5 seconde après le texte de changé dans ma EditText?
Je suis filtrage ma liste à l'aide d'un EditText. Je veux filtrer la liste 0,5 seconde après que l'utilisateur a terminé de taper dans l'EditText. J'ai utilisé le afterTextChanged
cas de TextWatcher
à cette fin. Mais cet événement s'élève pour chaque caractère changements dans l'EditText.
Que dois-je faire?
Vous devez vous connecter pour publier un commentaire.
Le truc, c'est l'annulation et la re-planification
Timer
à chaque fois, lorsque le texteEditText
est changé. Bonne chance!Mise à JOUR
Pour ceux qui sont intéressés dans combien de temps pour régler le délai, voir ce post.
delayInMillis
est toutlong
variable représentant le retard (0,5 s dans ce cas). Vous pouvez également utiliser500
au lieu de cela. Voir ma réponse mis à jour.De mieux utiliser le Gestionnaire avec postDelayed() la méthode. Dans l'android de la mise en œuvre de la Minuterie va créer un nouveau thread à chaque fois pour exécuter la tâche. Gestionnaire cependant a son propre Looper qui peut être attaché à ce que le fil nous souhaitons, de sorte que nous ne paient pas de coût supplémentaire pour créer de thread.
Exemple
Runnable
être appelée après un certain temps et que le contexte est retiré par exemple parce que l'utilisateur s'éloigne de cet écran?Vous pouvez utiliser RxBindings, c'est la meilleure solution. Voir le guide de RxJava opérateur anti-rebond, je suis certain que cela va le faire dans votre cas.
http://reactivex.io/documentation/operators/debounce.html
Non de la solution ci-dessus a fonctionné pour moi.
J'ai besoin d'un moyen pour TextWatcher pas à l'incendie sur chaque personnage que j'ai en entrée à l'intérieur de mon affichage de la recherche et de montrer quelques progrès, le sens je besoin pour accéder au thread de l'INTERFACE utilisateur.
Retrait de Gestionnaire sur chaque onTextChanged (qui est appelée lorsque l'utilisateur tape un nouveau personnage). afterTextChanged est appelée après que le texte a été modifié à l'intérieur de champ de saisie où l'on peut commencer à nouveau Praticable, mais l'annuler si l'utilisateur les types de caractères (Pour plus d'info, lorsque ces callback est appelée, voir ce). Si l'utilisateur ne possède pas d'entrée plus de caractères, intervalles de passer dans postDelayed et il va appeler le travail que vous devez faire avec ce texte.
Ce code sera exécuté qu'une seule fois par intervalle, et pas pour chaque clé entrées de l'utilisateur. Espérons que cela aide quelqu'un dans l'avenir.
Comment déterminez-vous qu'ils ont fini d'écrire? Que l'edittext perd le focus? Puis il y a setOnFocusChangedListener.
De répondre à la dernière modification en question: Si vous souhaitez attendre un certain temps après la dernière pression de touche, alors vous devez démarrer un thread à la première pression de touche (utiliser TextWatcher). Constamment enregistrer le temps de la dernière touche. Laisser le fil de sommeil au moment de la dernière séquence de touches + 0,5 secondes. Si le timestamp de la dernière frappe n'a pas été mis à jour, faire ce que vous aviez prévu.
Vous pouvez également utiliser TextWatcher interface et créer votre propre classe qui l'implémente de réutiliser de nombreuses fois votre CustomTextWatcher et également vous pouvez passer des points de vue ou tout ce que vous pourriez avoir besoin de son constructeur:
Maintenant dans votre activité, vous pouvez l'utiliser comme ceci:
qui est le cas pendant et après l'arrivée de taper ... ajouter un textWatcher et dans le onTextChanged méthode de vente :
if (charSequence.length() > 0){//your code }
Si vous voulez sauter le textWatcher pour la première fois seulement, puis ajoutez le code suivant:
Cela permettra textWatcher faire tout changement à partir de la deuxième fois.
Dans Kotlin Langue, vous pouvez faire comme ceci
Avec Kotlin fonctions d'extension et de coroutines:
Vous pouvez utiliser
EditorActionListener
à cette fin.À l'aide de la minuterie pour votre cas n'est pas la meilleure solution en raison de la création d'un nouvel objet à chaque fois. En fonction de Minuterie de la documentation(http://developer.android.com/reference/java/util/Timer.html) il est préférable d'utiliser ScheduledThreadPoolExecutor -
Ici est meilleure approche