Jump to content
steph68

AutoCompleteTextView & class Async

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!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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.

Edited by djeman

Share this post


Link to post
Share on other 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:

Edited by steph68

Share this post


Link to post
Share on other 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.

Edited by djeman
  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.






×
×
  • Create New...