Aller au contenu

AutoCompleteTextView & class Async


steph68

Recommended Posts

Hello!

Je débute sous Android et je me suis fait une petite appli basé sur les Google API 2.1.

A ce moment là je ne savais pas encore qu'il fallait séparer les accès réseaux de l'UI.

Depuis j'ai corrigé le tir avec des classes Async et Google API 4.0.

Mais je bute sur un problème que je n'arrive pas à résoudre!

-> 1 AutoCompleteTextView sur mon champs ville

AVANT (2.1):

public void onTextChanged(CharSequence s, int start, int before, int count)
{
String result = null;
InputStream is = null;
List<String> r = new ArrayList<String>();

if (ville.enoughToFilter()) //REQUETE uniquement à partir de 'n' caractères saisis (= 4 ici dans threshold dans .XML)!
{
//établissement de la connexion http
is = connexionHttp(BASE_URL + "ville.php?ville=" + ville.getText());

//récup des data brutes ~> string
result = lectureData(is);

	 //décodage JSON de l'input stream
	 try
	 {	
		 //remplissage DATA
 JSONArray jArray = new JSONArray(result);
	 JSONObject json_data=null;
	 for(int i=0;i<jArray.length();i++)
	 {
			 json_data = jArray.getJSONObject(i);
			 r.add(json_data.getString("VILLE"));
			 a_idVil.add(json_data.getString("CLEF_VILLE"));	
		 }
	 ville.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_selectable_list_item,r));
	 ville.setOnItemSelectedListener(new villeListener());

	 }
	 catch(JSONException e1)
	 {
	 Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
	 Log.d("***** TestActivity/onTextChanged: JSONException *****", "--"+e1.toString()+"--");
	 }
	 catch(ParseException e1)
	 {
	 Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
	 Log.d("***** TestActivity/onTextChanged: ParseException *****", "--"+e1.toString()+"--");
 }
 }
}

public class villeListener implements OnItemSelectedListener
{
 public void onItemSelected(AdapterView<?> parent, View v, int pos, long row)
 {
 villePosition = pos;
 }
 public void onNothingSelected(AdapterView<?> arg0) { }
}

fonctionnement 100% normal:

-> à partir du 4ème caractère saisi, une rqt est lancée en base pour trouver toutes les villes débutant par ces 4 caractères + affichage en liste, avec sélection de la bonne ville :)

-> le listener affecte bien l'indice de la ville choisie dans la liste :)

APRES (4.1):

public void onTextChanged(CharSequence s, int start, int before, int count)
{
if (ville.enoughToFilter()) //REQUETE uniquement à partir de 'n' caractères saisis (= 4 ici dans threshold dans .XML)!
{
new RemplirVille().execute(BASE_URL + "ville.php?ville=" + ville.getText());
Log.d("***********","AVANT");
ville.setOnItemSelectedListener(new villeListener());
Log.d("***********","APRES");
}

}
public class villeListener implements OnItemSelectedListener
{
public void onItemSelected(AdapterView<?> parent, View v, int pos, long row)
{
villePosition = pos;
Log.d("*************9999999", "1111111111");
}
public void onNothingSelected(AdapterView<?> arg0) { }
}

class RemplirVille extends AsyncTask<String, String, List<String>>
{
Integer errorMsgId;
String errorMsgParam;

protected List<String> doInBackground(String... param)
{
List<String> listeAffichageVille = new ArrayList<String>();
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

try
{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(param[0]);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
if (response.getStatusLine().getStatusCode() < 400)
{
HttpEntity entity = response.getEntity();
String entityStr = EntityUtils.toString(entity);
JSONArray json_array = new JSONArray(entityStr);

for(int i=0;i<json_array.length();i++)
{
JSONObject json_ligne = json_array.getJSONObject(i);						
listeAffichageVille.add(json_ligne.getString("VILLE"));
a_idVil.add(json_ligne.getString("CLEF_VILLE"));
}
}
else
{
Log.d("***** TestActivity/ASYNC RemplirVille: EXCEPTION http error *****", "--"+response.getStatusLine().toString()+"--");
this.errorMsgId = R.string.http_site_error;
listeAffichageVille = null;
}
}
catch (Exception ex)
{
Log.d("***** TestActivity/ASYNC RemplirVille: EXCEPTION decode error *****", "--"+ex.toString()+"--");
this.errorMsgId = R.string.http_decode_error;
this.errorMsgParam = ex.getLocalizedMessage();
listeAffichageVille = null;
}
return listeAffichageVille;
}

protected void onprogressUpdate(String... item) { }
protected void onPreExecute(List<String> list) { }
protected void onPostExecute(List<String> list)
{
if (list == null) //si NULL alors problème...
{
if (this.errorMsgId != null)
{
String msg = TestActivity.this.getString(this.errorMsgId);
Toast.makeText(TestActivity.this,msg,Toast.LENGTH_LONG).show();
}
}
else //.. SINON affecter les data à l'adapter!
{
[b]ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,list));[/b]
}
}
}

fonctionnement dégradé:

-> il faut saisir enoughToFilter + 1 caractères pour afficher la liste des villes débutant par ces 4+1 caractères(?) :(

-> on ne passe plus dans le listener(?) :(

J'ai déjà reprise le déroulement du code un bon paquet de fois, mais je ne vois pas!

Et comme à force je connais trop bien mon source, de toute façon je ne lis plus vraiment, je survole!

En fait enoughToFilter fonctionne bien, il déclenche bien l'exécution de la classe RemplirVille, qui fait bien son taff aussi (rqt, data ok) sauf que l'affichage de la liste des villes ne se fait pas!

Du coup, comme la liste ne s'affiche pas, on saisi 1 car de plus:

-> enoughToFilter toujours ok puisqu'on est à min+1

-> RemplirVille refait la rqt, ramène encore une fois les data.... et cette fois-ci, oh miracle, affiche bien la liste de choix. :huh:

Une idée sur la question?

:P

Lien vers le commentaire
Partager sur d’autres sites

J'avais pensé à cette piste en effet, sauf qu'au deuxième passage j'ai bien le résultat correspondant à (nb_car_min+1), et non (nb_car_min) du 1er passage.

Sinon, éventuellement, comment ralentir le main pour laisser + de temps l'async?

Lien vers le commentaire
Partager sur d’autres sites

L'asynchronisme ne devrait pas influer sur le (bon) fonctionnement. D'ailleurs, j'ai fait un rapide test, et ça fonctionne très bien dès le treshold atteint. Le problème doit être ailleurs. Mais j'avoue ne pas voir où...

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Si je peux me permettre, etant donné que tu débute android, pourquoi ne pas utiliser les thread et comprendre le fonctionnement de ce dernier au lieu d'utiliser AsynTask qui fait la même chose, en plus simple je suppose.

Va voir mes posts, d'ailleur tu verra que c'est un peu similaire, au passage merci à djeman toujours la pour aider

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

Merci deep21 mais n'oublies pas chpil, si je ne t'aurai pas aidé il aurait été là comme il l'est depuis le début :)

Sinon ton AsyncTask qui doit gérer tout seul l'event de fin de background task à l'air d'être foireux ... à part si ta liste serait vide le 1er coup ? Wé t'as pas mis de message d'erreur si la liste est vide, ton asynctask se finit sans rien faire si c'est le cas.

Je suis d'accord avec toi qu'elle ne devrait pas être vide mais parfois les trucs qui gèrent auto font des trucs étranges.

Et un thread n'est pas dur à gérer sur ce genre de tache asynchrone, il te faut juste un handler dans ta classe pour récupérer le signal de fin de ton thread et s'en servir pour afficher les infos dans ton adapter (Car comme tu l'as compris le thread principal et le thread de rendu de l'ui).

Si tu ne trouves pas le soucis de ton AsyncTask ça peut être une solution de rechange.

Lien vers le commentaire
Partager sur d’autres sites

Alors, pour les détails:

1) j'ai entouré la ligne

ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,list));

par deux log

Log.d("AVANT");
ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,list));
Log.d("APRES");

2) ces 2 log sont bien lancés 2 fois

-> threshold

-> threshold + 1

3.) j'ai aussi logué les paramètres du setAdapter:

-> list: contient bien les bonnes data lors des 2 passages (villes débutant par xxx 1ère fois, et xxxx la 2ème)

-> android.R.layout.simple_selectable_list_item: bon ben là rien à dire, constante android

-> TestActivit.this: j'ai aussi testé tous les contextes possibles (getbasecontext, getapplicationcontext, etc...) et j'ai même déclaré une globale Context que j'initialise au début du onCreate pour être 100% sûr

Mais le résultat est malheureusement toujours le même. :o

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

Ben donc ton asynctask est foireuse ... ne me demande pas pourquoi j'en sais rien mais si tu me dis que setadapter est bien exécuté avec les bonnes variables ... ah t'as oublié de me dire un truc, ville est bien initialisé ?

Wé je te demande ça car il ne reste plus beaucoup le choix, soit ville n'est pas initialisé avec la bonne textview soit ça ne s’exécute pas sur le bon thread.

Le fait que t’exécute un event dans un autre peut peut-être foutre le bordel.

Je te le redis, test un thread au lieu de l'asynctask, le nom fait peut etre peur mais t'es pas en c++ et comme deep21 te l'a dit on a plein d'exemple simple sous la main.

Parfois faut savoir utiliser un autre système quand celui qu'on souhaite utiliser ne fait pas ce qu'on veut.

Edit:

Correction: Pas un event dans l'autre, je voulais dire ton asynctask à partir d'un event.

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

Oui, j'ai logué toutes les data envoyées à l'adapter, comme expliqué ci-dessus: list = ville

pour ta correction: j'ai le même principe d'Async pour remplir des spinner et no soucy :huh:

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

Ok j'ai fait un test avec un thread:

-> méthode run() quasi identique à doItInBackground() de Async: ok

class RemplirVille2 extends Thread
{
private String URL;


 public RemplirVille2(String url)
{
 this.URL = url;
}

public void run()
{
 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

try
{
				 HttpClient httpclient = new DefaultHttpClient();
				 HttpPost httppost = new HttpPost(URL);
				 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
				 HttpResponse response = httpclient.execute(httppost);

				 if (response.getStatusLine().getStatusCode() < 400)
{
					 HttpEntity entity = response.getEntity();
					 String entityStr = EntityUtils.toString(entity);
					 JSONArray json_array = new JSONArray(entityStr);

					 for(int i=0;i<json_array.length();i++)
{
						 JSONObject json_ligne = json_array.getJSONObject(i);						
						 listeAffichageVille.add(json_ligne.getString("VILLE"));
						 a_idVil.add(json_ligne.getString("CLEF_VILLE"));							
}
}
else
{
				 this.errorMsgId = R.string.http_site_error;
				 listeAffichageVille = null;					
			 }
	 }
catch (Exception ex)
{
			 this.errorMsgId = R.string.http_decode_error;
			 this.errorMsgParam = ex.getLocalizedMessage();
			 listeAffichageVille = null;
	 }
Log.d("******* FIN RUN", "("+listeAffichageVille+")");
}
}

-> avec en global, comme être accessible depuis thread & UI

Integer errorMsgId;
String errorMsgParam;
List<String> listeAffichageVille = new ArrayList<String>();

-> et tu sais quoi??? exactement pareil!!! :emo_im_foot_in_mouth:

?????????????

la preuve est donc faite que ce n'est pas lié à l'asynchrone ou au thread.......

mais alors ******* de ******** de ******* d'où ça vient?

c'est totalement fou!

ok, en rajoutant une boucle while alive la liste s'affiche correctement:

public void onTextChanged(CharSequence s, int start, int before, int count)
{
if (ville.enoughToFilter())
{
 RemplirVille2 thread = new RemplirVille2(BASE_URL + "ville.php?ville=" + ville.getText());
 thread.start();
while (thread.isAlive())
 {
	 //rien, juste attendre fin thread pour envoyer la liste à l'adapter
	 //Log.d("******* RUN", "");
 }

 //équivalent du onPostExecute d'Async
 if (listeAffichageVille == null) //si NULL alors problème...
{
if (errorMsgId != null)
 {
				 String msg = TestActivity.this.getString(this.errorMsgId);
				 Toast.makeText(TestActivity.this,msg,Toast.LENGTH_LONG).show();
 }
}
else //.. SINON affecter les data à l'adapter!
{
ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,listeAffichageVille));
}
}
}

public void onItemSelected(AdapterView<?> parent,View v, int position, long id)
{
coucou("*****************tata");
villePosition = position;
chercher(v);
}

on avance... même si ça me semble louche quand même...

par contre, on n'entre toujours pas dans onItemSelected, bien qu'il soit évidemment défini dans mon UI avec un

ville.setOnItemSelectedListener(this);

Lien vers le commentaire
Partager sur d’autres sites

Bon c'est pas évident à lire avec l'indentation cassé ^^

Mais là ton thread tu l'utilises mal, on fait jamais de boucle infini sans aucune commande (mini un sleep(1) au milieu) mais effectivement t'as jamais utilisé les threads.

Donc c'est "normal" que tu dois mettre cette boucle car un thread par définition c'est asynchrone à part si tu le synchronises avec quelque chose mais là on va pas parler :)

Déjà la mise en place du thread, on a plutôt tendance à utiliser "implements Runnable" à la place de "extends Thread" :

... extends Thread

– Avantages : Chaque thread a ses données qui lui sont propres.

– Inconvénients : On ne peut plus hériter d'une autre classe.

... implements Runnable

– Avantages : L'héritage reste possible.

– Inconvénients : Les attributs de votre classe sont partagés par tous les threads qui y sont basés (parfois un un avantage)

Bon c'est un détail mais pour connaitre la fin de ton thread c'est là que ça ne va pas du tout, ce qu'on utilise le plus couramment est un handler.

Donc dans ton activité qui lance le thread tu dois placer un Handler, exemple :

public class TestActivity extends Activity {
   private static final int HANDLER_END_REMPLIR_VILLE = 0;

   protected static final String BASE_URL = "http://moo.moo";

   private AutoCompleteTextView ville;
   private List<String> a_idVil;
   private int villePosition = 0;
   private Message msg = null;

   private List<String> listVille;

   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       listVille = new ArrayList<String>();

       ville.findViewById(R.id.moo);
       ville.setOnItemSelectedListener(new villeListener());
   }

   private Handler handler = new Handler() {
       @Override
       public void handleMessage(Message msg) {
           switch (msg.what) {
           case HANDLER_END_REMPLIR_VILLE:
               if (msg.getData().getString("val").contains("true"))
                   updateTextView();
               break;
           }

           super.handleMessage(msg);
       }
   };

   ...

   public void onTextChanged(CharSequence s, int start, int before, int count)
   {
       new Thread(new Runnable() {
           @Override
           public void run() {
               if (ville.enoughToFilter()) {
                   //établissement de la connexion http
                   InputStream is = connexionHttp(BASE_URL + "ville.php?ville=" + ville.getText());

                   //récup des data brutes ~> string
                   String result = lectureData(is);

                   Bundle data = new Bundle();
                   data.putString("val", "true");

                   //décodage JSON de l'input stream
                   try {	 
                       //remplissage DATA
                       JSONArray jArray = new JSONArray(result);
                       JSONObject json_data=null;
                       for(int i=0;i<jArray.length();i++)
                       {
                           json_data = jArray.getJSONObject(i);
                           listVille.add(json_data.getString("VILLE"));
                           a_idVil.add(json_data.getString("CLEF_VILLE"));	   
                       }
                       //ville.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_selectable_list_item,listVille));

                   } catch(JSONException e1) {
                       Log.d("***** TestActivity/onTextChanged: JSONException *****", "--"+e1.toString()+"--");
                       data.putString("val", "false");
                   } catch(ParseException e1) {
                       Log.d("***** TestActivity/onTextChanged: ParseException *****", "--"+e1.toString()+"--");
                       data.putString("val", "false");
                   }

                   msg = handler.obtainMessage(HANDLER_END_REMPLIR_VILLE);
                   msg.setData(data);
                   handler.sendMessage(msg);
               }

           }
       }).start();
   }

   protected void updateTextView() {
       ville.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_selectable_list_item,listVille));
   }

   public class villeListener implements OnItemSelectedListener
   {
       @Override
       public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
           villePosition = position;
           Log.d("*************9999999", "1111111111");
       }
       @Override
       public void onNothingSelected(AdapterView<?> parent) {
           // TODO Auto-generated method stub

       }
   }

   ...
};

Voila j'ai essayé de te faire l'exemple avec l'handler et pour pas t’embêter à faire passer des bundles par l'handler ben je l'ai laissé dans la classe et je me suis servi du bundle pour savoir si ça a réussi ou non.

Bon c'est un exemple pour le handler, le reste t'y fais pas gaffe ! :)

Edit: J'ai rajouté la gestion des erreurs de ton thread avec un petit bundle.

Edit2: J'ai remis le start sur mon thread qui avait sauté au deuxième copié/collé ^^

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

pffffffffffffffffff, commence même a voir peur de poster maintenant............... :(

je ne doute pas de vos capacités, ni du fait que vous postez du bon code, mais ICI c'est toujours aussi space!

-> j'ai testé ta version

-> il passe bien dans le updateTextView() à enoughToFilter mais sans afficher la listview, malgré le ville.setAdapter()

-> il y repasse bien à (enoughToFilter+1) et cette fois j'ai bien l'affichage de la listview

-> il ne passe pas dans onItemSelected()

Bref, ça fait exactement comme "ma" version.

Je vais virer maboule!!!!!

Lien vers le commentaire
Partager sur d’autres sites

Bon on se décourage pas, le test a permis de voir que le problème se situe ailleurs.

C'est un truc space quand même car tout devrait fonctionner, t'as pas mis un truc bizarre dans ton manifest ? Pourquoi t'utilises la google api au lieu de l'api classique ?

Sinon essayes de tout déclarer d'un coup avant et de te servir du thread pour seulement modifier l'adapter.

Style par rapport à mon exemple :

private List<String> listVille;
   private ArrayAdapter<String> aa;

   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       ville = (AutoCompleteTextView) findViewById(R.id.moo);

       listVille = new ArrayList<String>();
       aa = new ArrayAdapter<String>(this,android.R.layout.simple_selectable_list_item,listVille);
       ville.setAdapter(aa);
       ville.setOnItemSelectedListener(new villeListener());
   }

   ....

   protected void updateTextView() {
       aa.clear();
       aa.addAll(listVille);
       aa.notifyDataSetChanged();
   }

Là en ayant toute l'initialisation d'un coup au début ça peut peut etre jouer ... mais franchement ça devient inexplicable ton soucis.

notifyDataSetChanged est censé forcer le composant hébergeant l'adapter à être redessiné.

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

- Google API: parce qu'une des fonctionnalité de mon appli gère de la géoloc

- modif du code: je vais voir ça

merci.

Bon ben.......... pareil.

Je vais [color=red]qd[/color] même essayer avec l'api 4.1 standard!

En attendant, voici le manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bidule.com"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
 android:minSdkVersion="11"
 android:targetSdkVersion="16" />
<application
 android:icon="@drawable/ic_launcher"
 android:label="@string/app_name"
 android:theme="@style/AppTheme" >
 <uses-library android:name="com.google.android.maps" />
 <!-- activité PRINCIPALE dans le LAUNCHER -->
 <activity
	 android:name=".TestActivity"
	 android:label="@string/title_activity" >
	 <intent-filter>
		 <action android:name="android.intent.action.MAIN" />
		 <category android:name="android.intent.category.LAUNCHER" />
	 </intent-filter>
 </activity>
 <!-- activité FILLE d'affichage des résultats -->
 <activity
	 android:name=".AfficherListe"
	 android:label="@string/title_activity_afficher_liste" >
	 <intent-filter>
		 <action android:name="android.intent.action.VIEW" />
		 <category android:name="android.intent.category.DEFAULT" />
	 </intent-filter>
 </activity>
 <!-- TEMPORAIRE DEVELOPPEMENT ******************************************************************* -->
 <activity
	 android:name=".Z_GeolocAfficheCarte"
	 android:label="@string/title_activity_afficher_detail" >
	 <intent-filter>
		 <action android:name="android.intent.action.VIEW" />
		 <category android:name="android.intent.category.DEFAULT" />
	 </intent-filter>
 </activity>
 <activity
	 android:name=".Z_GeolocLatitudeLongitude"
	 android:label="@string/title_activity_afficher_detail" >
	 <intent-filter>
		 <action android:name="android.intent.action.VIEW" />
		 <category android:name="android.intent.category.DEFAULT" />
	 </intent-filter>
 </activity>
 <!-- TEMPORAIRE DEVELOPPEMENT ******************************************************************* -->
 <activity
	 android:name=".AfficherListe2"
	 android:label="@string/title_activity_afficher_liste2" >
	 <intent-filter>
		 <action android:name="android.intent.action.MAIN" />
		 <category android:name="android.intent.category.LAUNCHER" />
	 </intent-filter>
 </activity>
 <activity
	 android:name=".AfficherDetails"
	 android:label="@string/title_activity_afficher_details" >
	 <intent-filter>
		 <action android:name="android.intent.action.MAIN" />
		 <category android:name="android.intent.category.LAUNCHER" />
	 </intent-filter>
 </activity>

</application>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.LOCATION" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
</manifest>

Lien vers le commentaire
Partager sur d’autres sites

Bon, j'ai fait mieux niveau test, une samsung galaxy sous android 4.1.

-> pareil

Donc à priori pas un soucis d'émulateur!

Ca nous laisse quoi si l'OS & le code est bon?

Autre idée: est ce que l'UI serait trop chargée (bien que les traitements lourds type réseaux soit en Async/Thread) et que certaines lignes de codes ne soient pas exécutées, tout simplement?

A mon sens, pas impossible... pourquoi pas... sauf que dans ce cas là, le code skippé devrait être aléatoire, pas systématiquement identique, non?

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

Franchement là je l'admet je comprends pas le soucis ... il faudrait voir le code complet car comme tu le dis quelque chose doit interférer ...

Non même si tu chargerais trop ton ui tu ne ferais que la ralentir.

T'as essayé en séparant ton bout de code dans une activité externe ? Comme chpil l'avait fait ?

Pour voir si le problème vient du code ou de l'environnement de développement ? Environnement et rom de test, car bon je veux pas être méchant sur les roms customs mais il y a beaucoup de bricolage pourri par des gars qui n'y connaissent rien pour quelques unes de bonnes.

Sinon tu peux forcer le truc mais ça pourri le code et c'est pas beau et ça se fait pas, en plaçant le setdapter suivi d'un noifydatachanged ... ça se fait pas, ou en tout cas ça ne devrait pas se faire ... ça alourdit le code ... berk ...

Lien vers le commentaire
Partager sur d’autres sites

notifydatachanged: déjà fait

séparer le code: fait mais comportement identique

-> te dépose le projet qq part en ligne ma version ASYNC originale + THREAD

-> et t'envoie le lien en MP

par contre, je ne peux pas donner l'URL que j'utilise, donc pour tester utilises:

-> soit un tableau de String

-> soit une table/requete d'un wamp ou autre

Lien vers le commentaire
Partager sur d’autres sites

J'avais même pas fait gaffe, mais le fonctionnement de ton AutoCompleteTextView est sérieusement dégradé.

Au moment où android gère l'autocomplétion pour afficher la liste de choix correspondant aux caractères tout seul ben toi tu lui update l'adapter ...

Sinon ça se "met à jour" chez moi, mais bon c'est un peu cagieux car la mise à jour de l'adapter remets à zéro la liste et donc annule l'autocomplétion.

Vais regarder de plus près dès que j'ai un peu de temps.

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

mise à jour: OUI

-> mais à (enough2filter + 1) pour Async (ok à enough2filter pour Thread

-> ET onItemSelected jamais exécuté, Async ou Thread

sinon, je ne comprends pas trop ta 2ème phrase.... puisque l'autocomplétion se fait justement par les data de la liste de choix

-> à partir de enough2filter, on lance la rqt qui rempli la liste

-> liste envoyée à l'adapter

-> adapter qui gère l'autocompletion

merci.

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...