Aller au contenu

AutoCompleteTextView & class Async


steph68

Recommended Posts

bon ben écoute, en remplaçant le onItemSelected() jamais exécuté par onItemClick() j'obtiens aussi ce qu'il me faut.

quant à savoir pourquoi il se bornait à ne pas lancer le onItemSelected(), ça..................................... je renonce, déjà passé trop de temps là dessus...........

mais c d'autant plus space que si je commentarise le corps de la fct, Eclispe gu***** puisque pour lui, il manque 1 méthode abstraite à la classe!

Lien vers le commentaire
Partager sur d’autres sites

A mon avis tu vois pas ce que je veux dire à cause de ta source de donnée.

Ma source => http://msieurlolo.fr/temp/json_test.oo

J'entre 4 lettres "Mars", la liste se met à jour, l'adapter se met à jour, il m'affiche donc dans les choix le 1er élément de l'adapter "NEW YORK CITY" au lieu de m'afficher l'autocompletion.

J'entre une lettre de plus un "e" donc j'ai "Marse" dans ma textview, l'autocompletion m'affiche "Marseille" pendant 1 ou 2s le temps que l'adapter se fasse changer et hop du coup il m'affiche en autocompletion le 1er élément "NEW YORK CITY".

Tu vois mieux le truc ? Si je charge ma liste complète dans le oncreate et que j'enlève ton event "onTextChanged" tout fonctionne normalement niveau autocompletion.

Et si t'implemente un truc dans ta classe t'es obligé d'y mettre les fonctions que t'implemente même si tu ne les utilises pas.

Lien vers le commentaire
Partager sur d’autres sites

adapter: oui effectivement j'ai du mal à voir l'explication :mellow: peut être que je mélange des notions

-> tu peux me renvoyer le code corrigé STP?

-> là j'aurais une base de travail concrète en comparant ma version & la tienne ^_^

implémentation: oui, je sais, mais CT juste pour dire que si je commentarise ma fct il la réclamme, et [color=red]qd[/color] elle existe il s'en tape et ne passe pas dedans. :unsure:

Lien vers le commentaire
Partager sur d’autres sites

Tiens j'avais même pas regardé pour l'event et effectivement il fait rien, je corrige ça et je te passe la classe.

adapter c'est justement pour pas embrouiller avec le français, tu crée une arrayadapter que tu assignes à une autocompletetextview avec un setadapter. Quand je parle de changement ben c'est le moment ou tu l'assignes.

Edit:

Bon conclusion, onitemselected ne fonctionnera pas avec un controle touch car tu ne fais que cliquer dessus tu ne le sélectionnes jamais.

Par contre si quelqu'un utilise un clavier, un pad, ... un truc qui permet de se déplacer dans une liste comme avec les flèches du clavier et d'appuyer sur entrée ben là il ne cliquera pas dessus il le sélectionnera (Et l'event click ne fonctionnera pas ^^).

On se sent moins débutant une fois qu'on le sais :P

Pour que l'autocompletion fonctionne correctement donc, j'ai chargé la liste direct dans l'autocompletetextview dans le oncreate puis j'y ai plus touché comme ça:

    @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       ville = (AutoCompleteTextView) findViewById(R.id.ville);
       new RemplirVille().execute(BASE_URL + "json_test.oo");
       //ville.addTextChangedListener(this);
       ville.setOnItemSelectedListener(this);
   }

Après il gère tout tout seul vu que t'as paramétré le completionThreshold dans le xml.

Modifié par djeman
Lien vers le commentaire
Partager sur d’autres sites

Ok, donc si j'ai bien compris, tu charges toute la liste des villes dès le départ, ok.

Sauf que dans mon cas, ça impliquerait de charger entièrement une table de +60 000 lignes :o . Impossible quoi!

Donc mon but au départ, et c'est peut être là que j'ai probablement fait 1 erreur technique ou d'explication claire, était de ne charger QUE les villes commençant par les 4 premières lettres, justement pour réduire le volume des data transférées.

En clair si je reprends ton exemple http://msieurlolo.fr/temp/json_test.oo

je tape au clavier: N

que se passe-t-il? rien

je tape au clavier: NE

que se passe-t-il? rien

je tape au clavier: NEW

que se passe-t-il? rien

je tape au clavier: NEWY

que se passe-t-il? - la RQT se lance et ramène les villes avec NEWY*

- la liste affiche " NEWYORK CITY, NEWYORK bateau, NEWYORK STATE "

- et là on sélectionne l'item qu'on veut parmi les 3 propositions

- ou je continue à taper

...

je tape au clavier: NEWYORK S

que se passe-t-il? - la RQT se lance et ramène les villes avec NEWYORK S*

- la liste affiche " NEWYORK STATE"

- et là on sélectionne l'item qu'on veut dans la liste

Donc, pour moi, il fallait bien passer par le onTextChanged, justement pour détecter la saisie du 4ème caractère.

Voilà l'idée au départ. :)

Est ce que c'est plus clair? ^_^

PS aux modos:

-> 'tain qu'est ce que c'est casse-c******* cette gestion des indentations dans cet éditeur!!! :angry:

-> pas moyen de faire qq chose? :unsure:

Modifié par steph68
Lien vers le commentaire
Partager sur d’autres sites

Ok ben tout est bon :)

Ah non un truc est pas terrible, pour améliorer le truc tu devrais récupérer la liste qu'avec 4 caractères.

3 caractères on affiche rien mais avec 5 la récupération de la liste est inutile car la textview peut gérer tout seul l'autocompletion avec les données qu'elle a.

Edit:

En faisant ça on se confronte au problème d'avoir aucun choix car au moment où on frappe le 4eme caractères l'adapter est vide donc l'autocompletion ne se fait pas.

Edit2:

Donc j'ai testé en bloquant l'update de l'adapter pour seulement 4 caractères en changeant:

if (ville.enoughToFilter())

par

if (ville.length() == ville.getThreshold())

Et là j'ai les choix qui n’apparaissaientt plus avec 4 caractères mais seulement avec 4+1 pour ce soucis je lui ai juste demandé de faire apparaitre la drop down liste après avoir chargé l'adapter.

            } else // .. SINON affecter les data à l'adapter!
           {
               ville.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_selectable_list_item, list));
               Log.d("*********ADAPTER OK", "DATA = " + list);

               if (ville.length() == ville.getThreshold())
                   ville.showDropDown();
               else
                   ville.setText(ville.getText());
           }

Bon ben là le problème est complètement réglé non ? :D

Edit3:

Modifié pour ceux qui frappent rapidement.

Modifié par djeman
  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...