Aller au contenu

Problème avec "onItemClick()"


laurent31

Recommended Posts

Bonjour

Dans le cadre d'un projet de recherche, nous développons une application distribuée qui doit tourner sur PC mobile et smartphones windows mobile et android (google phone).

En deux mots, il s'agit d'une application qui propose différents types de services à des usagers: donc modèle client/serveur avec des menus de choix pour le client.

Cette application est développée en java: J2ME sous windows mobile , SDK DoNut sous Android.

Les problèmes que nous rencontrons se situent sous Android pour récupérer le choix du client sur une liste.

Une activité principale (côté client) dialogue automatiquement avec le serveur, puis lance une interface (listView) qui a pour but d'afficher une liste d'items parmi lesquels le client pourra préciser son choix

Donc :

- mise en place d'un setOnItemClickListener

- utilisation de onItemClick pour récupérer la valeur sélectionnée par le client.

- Une méthode publique FaireChoix() permet de récupérer ce choix localement via un onItemClick : tout se passe comme si on restait indéfiniment dans le "onItemClick", alors que le choix a été renseigné mais le reste du programme ne voit pas ce choix.

- Il doit manquer l'équivalent d'un exit, mais pour l'instant nous n'avons rien trouvé dans la doc (android user manual).

Une idée de piste ?

merci d'avance pour vos propositions.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

J'ai avancé depuis mon post.

Maintenant j'envoie mon choix au serveur mais je ne "sors" toujours pas de mon OnItemClick(). Le booleen "Terminer" est toujours à faux (initialisation effectuée en global au début), ce qui m'empêche de continuer mon dialogue.

Code Dialogue côté client :

// Traitement du choix

FaireChoix(nbsession); // Construction d'une liste de session(s) + affichage de celle-ci a l'ecran + envoi choix

if (terminer == true)

{

// Utilisation session (OUI/NON)

RecevoirDemandeOutil(); // verif si outil chat.jar present

TrouverOutil(nomclient); // verifier presence outil + envoi reponse serveur

RecevoirAutorisation(); // recevoir accord utilisation session ou non

}

Code SetOnItemClick() : méthode public FaireChoix(nbre)

public void FaireChoix(int nbre)

{

ArrayList Sessions = new ArrayList();

for (int i = 0; i < nbre; i++)

{

Session enregistrement = new Session(0, " ", " ");

enregistrement = (Session) session.elementAt(i);

Sessions.add(enregistrement.getIdSession() + " " + enregistrement.getTheme());

}

setContentView(R.layout.choix);

liste = (ListView) findViewById(R.id.Liste);

final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, Sessions);

liste.setAdapter(adapter);

liste.setOnItemClickListener(new OnItemClickListener()

{

public void onItemClick(AdapterView<?> parent, View v, int position, long id)

{

choix = liste.getSelectedItem().toString(); // recupere le choix de l'utilisateur

System.out.println("Le choix selectionne : " + choix); // s'affiche bien sur la log Androîd (outil Catlog)

ps = new PrintStream(sortie);

ps.println(getNomClient() + " : Here my choice !");

ps.println(" " + choix);

ps.println("X");

terminer = true; // mise à vrai du booleen terminer - permet de continuer le dialogue

}

});

}

Code dialogue côté serveur :

String message5 = RecevoirChoix(); // Recevoir le choix selectionne (une session) par le client - OK

System.out.println(message5); // Affiche le message du client (Voici mon choix) - OK

// Traitement de la connexion a la session choisie

VerifierChoix(Liste); // fonctionne jusqu'au bout (envoi demande outil)

Une fois le choix reçu par le serveur celui-ci exécute la méthode publique "VerifierChoix(Liste)", ce qui se passe correctement. Par contre dans cette méthode, le serveur demande au client si celui-ci possède un outil particulier. L'envoi du message se fait correctement.

PB : la réception côté client ne se fait pas car "terminer" est toujours à FAUX alors que normalement il devrait être à VRAI.

Une remarque supplémentaire : si je ne met pas la condition "if (terminer = true) ....", l'affichage de ma "ListView" ne se fait pas ?

En gros, j'ai toujours le même problème sauf que ce n'est plus avec le choix.

J'espère que j'ai été clair dans les explications car comme tu t'en doutes je suis novice.

Lien vers le commentaire
Partager sur d’autres sites

ton terminer pour le propager tu as soit du le déclarer final ...soit static au début de ta classe ?

en final il ne peut pas être modifié (mais là ça compilerai pas ou exploserait)

en static c'est ok mais comme tout est dans un grosse boucle je suppose que c'est pas top.

Tu devrais faire ton choix dans un thread séparé (mais c'est bien chiant vu que le thread doit rappeler un autre thread pour agir sur l'UI.....)

en gros

creer thread choix

creer thread ui

liste+tout le truc

terminer =true

fin thread ui

fin thread choix

lancer le thread choix

boucle choix

si terminer faire truc et sortir

fin boucle choix

MAIS tout ça est bien pourri en fait.... un choix dans la philosophie android c'est:

lancement activity du choix

et onResult pour le retour du choix.....

et hop plié en 3 lignes de codes

Lien vers le commentaire
Partager sur d’autres sites

Oui, ton code semble assez séquentiel là où l'évènementiel est surement plus simple.

J'avoue que je ne comprends pas bien ce que c'est sensé faire. ton if(terminer) m'étonne, c'est pas plutôt un wait() ou un join() que tu voulais faire ? Mais dans ces cas là tu vas pourrir ton thread.

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