IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Gestion des tris


Sujet :

Android

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Par défaut Gestion des tris
    Bonjour à tous,

    je suis en train de gérer les tris dans mon application. C'est à dire que l'utilisateur aura le choix de trier les infos par prix, note etc...

    N'ayant pas trop d'idée comment gérer ça, j'ai utilisé les menu et sous menu Android. Dans le sous menu de trier j'ai une liste de RadioButton, qaui par défaut vaut 1 (le premier RadioButton). Si l'utilisateur change cela la variable passe à une autre variable et en fonction de cela il faut que je relance l'activité, mais comment je peux faire pour refaire un rechargement de l'activité. En effet, car je fais une connexion à une BDD MySQL et en fonction de la valeur de la variable, la requête ne sera pas la même dans le fichier PHP.

    Je vous remercie

    Italia57

  2. #2
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 299
    Par défaut
    Le plus simple, c'est d'avoir toutes les données dans la base de données SQLite à l'intérieur du téléphone.

    Que la ListView soit construite avec un CursorAdapter.
    Et après il y a une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monAdapter.changeCursor(cursor);
    Mais si tu veux juste savoir comment recharger une ListView il faut dire à l'Adapter :
    notifyDataSetChanged
    http://developer.android.com/referen...tChanged%28%29

    Parce que là si j'ai bien compris, si l'utilisateur veut trier ta liste, tu envois un truc à un serveur qui va te retourner la liste ?
    C'est pas terrible de faire ça...

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Par défaut
    Oui voilà, tu as bien, compris c'est ce que je souhaite faire...

    Le problème c'est qu'a aucun endroit de mon application j'utilise une BDD SQL Lite vu que je partage ma BDD MySQL pour le site et l'application mobile.

    Du coup comment je pourrais faire pour utiliser notifyDataSetChanged () dans mon cas ? car il faut que je refasse appel au client HTTP pour qu'il aille à nouveau dans le PHP etc...

  4. #4
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Je pense que tu devrais au minimum sauvegarder les informations que tu as demandés au serveur. Pense au cas où l'utilisateur n'a pas de connexion data ni Wifi.
    Cela ferait un premier temps d'accès "long" et les autres plus rapide. Cela t'éviterai aussi de faire X fois la même requête, épargnera le forfait data de l'utilisateur ... ainsi que de manipuler directement les données. Ce que tu demandes ici est simplement un "order by" SQL.

    Sinon, pour répondre totalement à ton besoin, j'imagine que tu utilises des classes représentant les items que tu as eu suite à ta requête. Fais en sorte qu'ils puissent être trié selon un comparateur, et trie cette liste selon ce comparateur. Peut être s'intéresser au design pattern "Strategy", qui me semble adapté ici.

    Si ton application native ne s'utilise absolument pas sans internet pour avoir des informations, autant faire un site web, non ?
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Par défaut
    J'ai envi de poser une question es-ce que les applications comme lequipe, eurosport etc.. peuvent être utilisé sans data ni wifi ? ou les applications comme guide michelin, lineternaute etc...

    Ce n'est pas un simple orderBy, car mon problème c'est que quand l'utilisateur choisi de modifier le critère de tri il a déjà un affichage par défault, une fois qu'il modifie le tri il faut que je relance la requête HTTP, qui avec un code différent ne fera pas la même requête que le choix par défault.

    L'autre solution serait donc de stocker les informations que je récupère de la BDD MySQL dans une BDD SQL Lite comme ça les accès suivant seront plus rapide ?

    Mais dans ce cas je n'ai aucune idée de comment faire.

  6. #6
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 299
    Par défaut
    Il faut que tu synchronises ta base de données MySQL avec la base de données tu téléphone.

    Dans ton cas c'est simple, puisque l'utilisateur ne peut pas envoyer de donner.
    Une solution simple, ce serait d'ajouter dans tes tables un champ qui contient la date à laquelle la ligne à été entrée.

    De cette façon, à chaque démarrage de l'application, si le téléphone est connecté à internet, pour chaque table t'appelles un web service (en lui donnait la MAX(date) de la table) et si des entrées on été modifié ou ajouté tu les récupéreras.

    Bon par contre si il est possible que des entrées soient supprimé dans la base, ça peut devenir plus compliqué.

    Le plus simple ce serait encore d'avoir un champ boolean dans chaque table pour dire si l'entrée existe ou pas.

    Bon j'ai mal expliqué, mais faudrait avoir plus d'infos aussi.

  7. #7
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Citation Envoyé par Italia57
    J'ai envi de poser une question es-ce que les applications comme lequipe, eurosport etc.. peuvent être utilisé sans data ni wifi ? ou les applications comme guide michelin, lineternaute etc...
    Et ? Des applications se fichent des utilisateurs, c'est un fait. Est-ce donc que ça doit devenir la norme ?
    N'oublie pas non plus que ces applications ont déjà une grosse base de clients potentiels, donc les utilisateurs passent beaucoup plus facilement sur des "détails" qui gâchent l'expérience utilisateur.

    Si je résume :
    • tu as un jeu de données qui ne change pas (point important).
    • les utilisateurs peuvent choisir selon quels critères les montrer


    Du moment que ton jeu de données ne change pas (et c'est ce que j'ai compris), tu n'as pas besoin de faire un nouvel appel au serveur. Tu as uniquement à ordonner la liste et notifier la vue que les données ont changées, non ?
    Tu tries tes objets (qui représentent les données) selon un comparateur, et basta, fini.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Par défaut
    Je ne suis pas totalement d'accord avec toi quand tu dis que ce genre d'application gâche l'expérience utilisateur, mais bon, on a le droit de pas être d'accord. Car qui es de nos jours à un SmartPhone sans abonnement data très peu de gens... Même si certains n'ont pas un 1GO de données ou plus, je ne vois pas en quoi cela pourrait gêner l'utilisateur. J'ai l'impression que beaucoup d'application d'actualités etc... fonctionne sur ce principe mais bon ce n'est pas franchement le sujet du topic donc passons.

    Mes données changes car ce que j'ai dans ma ListView dépend de ce que l'utilisateur à saisie à l'activité précédente. En effet ce qu'il a saisi je le récupère dans l'activité suivante grâce à un Bundle et j'envois ce résultat dans le PHP et ensuite j'exécute ma requête.

    Mais sur la même activité (la ou j'affiche les résultats je propose un tris via les menu et sous menu). Comment puis je faire pour recharger en fonction du code associé au type de tris choisi. En effet en fonction du code je devrais faire un orderBy sur tel ou tel attribut dans le SQL. Mais je ne sais pas comment faire pour une fois le code de tri récupérer. Relancer l'activité mais avec les mêmes données du bunble (pas les perdre) mais avec le nouveau code de tris.

  9. #9
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 299
    Par défaut
    Moi je n'active que très rarement le wifi ou la 3G.
    Être forcé d'être connecté pour accéder à une application ça fait chier.
    En plus parfois même si on veut se connecter on ne peut pas car on ne capte pas assez bien la 3G.

    En plus c'est beaucoup plus lent.
    Redemander toutes les informations à chaque fois c'est stupide.

    Il te faut une classe qui possède une instance de classe qui extends SQLiteOpenHelper, bon j'ai mal expliqué, mais c'est bien expliqué ici :
    http://a-renouard.developpez.com/tut...ndroid/sqlite/

    Tu avoir des méthodes qui feront des requètes SQL et qui retourneront un Cursor.
    Avec ce Cursor tu va peuplé ta ListView.
    Quand l'utilisateur changera le tri, tu appellera ta classe qui gère le SQL et tu fera changeCursor sur l'adapter et voilà.

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Par défaut
    oui mais comment je fais pour faire passer les données de la BDD MySQL à la BDD SQL Lite ?

  11. #11
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Atta, si j'ai bien compris :

    Étape 1 : l'utilisateur rentre quelque chose (activité 1)
    Étape 2 : tu fais une recherche avec ce quelque chose sur ton serveur (activité 1)
    Étape 3 : tu affiches ces données dans une autre activité (activité 2)
    Étape 4 : tu permets de trier ces données (activité 2)

    Donc, je persiste et signe, ton jeu de données ne change pas. Une fois les données affichées, tu permets de trier celles-ci, mais les données en elle-même ne changent pas du tout, seul l'ordre de celle-ci change.

    Tes données changent en fonction de ce que l'utilisateur rentre, oui.
    Ensuite, au sein de l'activité qui les affiche, ces données ne changent plus.

    Donc, tout ce que tu as à faire, c'est de trier le tableau de données présent dans la ListView, tu n'as pas besoin de faire un nouvel accès au serveur pour ça.
    Je le répète : passe par un comparateur et trie ta collection. Ensuite, invoque "notifyDataSetChanged()" de ta ListView (ou de son adaptateur, je ne sais plus).
    En l'état, ça donnerai :
    -liste affichée
    -appui sur "tri par ordre alphabétique"
    -tri de la collection selon l'ordre alphabétique
    -notification à la vue du changement de données
    -rafraîchissement de la vue

    Pour les utilisateurs, n'oublie pas qu'un accès réseau demande 2 choses : du temps (plus long qu'un accès local) et de la batterie (activer la connexion data ou wifi, laisser l'activation, télécharger ... VS lire un fichier). L'utilisateur peut ne pas se soucier de la connexion réseau obligatoire, mais ne pardonnera pas la lenteur.
    Là, je parle en général, le secteur de l'actualité est particulier, puisque les news peuvent arriver à tout moment. Dans ces cas-là : un service tourne en tâche de fond (du pull ... mauvais pour la batterie), ou une MaJ au lancement de l'application ET à la demande de l'utilisateur. En plus, on garde en local les articles "pas trop ancien", histoire d'éviter de recharger les mêmes.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  12. #12
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 299
    Par défaut
    Citation Envoyé par italia57 Voir le message
    oui mais comment je fais pour faire passer les données de la BDD MySQL à la BDD SQL Lite ?
    Alors ça dépend, est-ce que tu va toujours récupéré exactement les même données ?
    Ou alors tu va en modifier, en ajouter, en supprimer ?
    Si c'est juste modifier ou ajouter ce n'est pas un problème.
    (Là je parle de ta base de données MySQL, qu'on peut aussi appeler base de données Externe)

    La première étape que tu dois réaliser c'est créer ta base de donnée, j'ai déjà donné le lien vers le tuto.

    Commence par créer toutes les tables qu'il te faut.

    Ensuite il faudra que tu fasses des webservices.

  13. #13
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Par défaut
    Le problème étant que dans l'activité je fais la requête HTTP mais je récolte les données dans mon adapter perso. (Je passe un JSON Array à l'adapter Perso). Donc pour le tris ça me pose pas trop de problème, mais je ne sais pas comment gérer "notifyDataSetChanged()" car je ne connais pas du tout.

    Comme vous avez tendances à me dire que ma méthode est pas bonne ou je pourrais trouver l'information pour transférer les données MySQL vers une BDD SQL Lite.

    EDIT: je fais que des accès BDD MySQl pour le moment, pas d'insertion ni de modification...

  14. #14
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 299
    Par défaut
    Je l'ai déjà dis 2 fois :
    Suis ce tuto :
    http://a-renouard.developpez.com/tut...ndroid/sqlite/

    Tu va voir comment créer des tables et faire des insert.

  15. #15
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Par défaut
    On ne peut pas simplement, donner un .sql à une base de données SQL Lite et il construit le BDD avec cela. Il est pas possible de créer une BDD SQL Lite sans même la créer avec du code mais avec un éditeur graphique genre PHP MyAdmin.

  16. #16
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 299
    Par défaut
    Non.

  17. #17
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Par défaut
    C'est un peu l'antiquité quand même pour le coup je trouve.

  18. #18
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Non c'est une sécurité...
    L'utilisateur ne doit pas avoir accès au contenu de DB (directement).
    Les autres applications non plus.
    Donc c'est forcément l'application qui doit la constuire.

    Mais rien n’empêche de stocker une ressource avec tout le code à envoyer à SQLite pour créer la BD.

    Le plus simple est encore: coté MySQL des entrées avec "LAST_MODIFIED_DATE" not null, et un boolean ("ACTIVE")...
    Quand l'appli est lancée elle regarde si une connexion data est possible, et si c'est le cas fait un simple appel au serveur avec "getDataSince(lastSyncDate)"
    Le serveur renverra toutes les entrées modifiées depuis la dernière synchronisation, le client Android mettra alors à jour la base SQLite. Ceci peut-être fait en tâche de fond complètement, avec notification d'un changement des données (si besoin) qui permettra à l'application (si elle est lancée) de faire un "requery" automatique.
    Ensuite tout ce qui est présentation est laissé au soin de l'appli (ce qui inclus bien sur le sorting)

Discussions similaires

  1. vc++6 try catch gestion des exceptions..
    Par eomer212 dans le forum Visual C++
    Réponses: 2
    Dernier message: 27/01/2011, 00h12
  2. Gestion des erreurs avec le try catch
    Par shaun_the_sheep dans le forum Général Java
    Réponses: 8
    Dernier message: 03/03/2010, 10h22
  3. Gestion des exceptions imbriquée dans des Try et boucle
    Par Droïde Système7 dans le forum Débuter
    Réponses: 7
    Dernier message: 13/01/2010, 18h30
  4. Gestion des exeptions (try catch) en Java
    Par EIN-LESER dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 21/05/2008, 19h51
  5. [TSMDBGrid] Gestion des critères de tri
    Par Laurent Dardenne dans le forum Bases de données
    Réponses: 5
    Dernier message: 26/02/2007, 14h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo