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

Composants graphiques Android Discussion :

Chargement ListView bloquer les clics


Sujet :

Composants graphiques Android

  1. #1
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut Chargement ListView bloquer les clics
    Bonjour,

    j'ai un soucis sur la gestion du chargement d'une activité lourde (contact).

    Le problème c'est que je lance l'activité et celle-ci charge les contact dans une liste view dans le onCreate().

    Cependant si l'utilisateur perd patience et click il va automatiquement sélectionner un élément de la listView et sortir de la vue.

    (La sélection d'un contact retourne à la vue principale).

    Voila le code que j'ai pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
        	super.onCreate(savedInstanceState);
        	setContentView(R.layout.contact_preview);
        	m_listView = (ListView) findViewById(R.id.listImage);
     
        	// Set the listview !!
    		m_adapter = new ContactAdapter(this);
    		m_listView.setAdapter(m_adapter);
     
    		// This method get contact from system and set the result in the m_listContact list.
    		getContact();	
    		m_adapter.setListFile(m_listContact);
    		m_adapter.notifyDataSetChanged();
    		m_listView.setOnItemClickListener(contactListener);
        }
    Quelques conseils ?

    Merci

  2. #2
    Membre habitué
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 108
    Points : 163
    Points
    163
    Par défaut
    Bonjour,

    vous pourriez peut être ajouter un dialog de chargement ?

    Avec quelque chose de ce type la : Ici

    (J'ai pris un blog au hasard qui parle des progressDialog)

    ICI tu as la doc officielle sur les progressDialog

    et ici un topic google sur les dialog en général.

    En espérant que cela t'aide.

  3. #3
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut
    Oui c'est une bonne piste.

    J'essaye ça dès que j'ai un peu de temps libre et je te donne un feedback

    Merci

  4. #4
    Membre actif
    Homme Profil pro
    Développeur Java / C++
    Inscrit en
    Mars 2013
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java / C++

    Informations forums :
    Inscription : Mars 2013
    Messages : 128
    Points : 228
    Points
    228
    Par défaut
    Bonjour manticore,

    Le plus simple serait de "bloquer" la méthode onClick tant que le chargement n'est pas finie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    onClick(View v){
         if(loadIsFinished){
              // Ici on peut gérer l'évènement du click, si la liste a complèetement chargé!
         }
    }
    Pensez à lire les règles du forum avant de poster.

    Si un poste ou un commentaire vous a été utile, merci de mettre un petit !
    Problème résolu? alors pensez à cliquer sur .
    Si vous avez trouvé la solution tout seul, merci de la poster, ça pourrait aider les suivants!

    Bonjour, s'il vous plaît et merci => ses mots ne coûtent rien, mais ils font toujours plaisirs!

  5. #5
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut
    Alors j'ai résolu mon problème, mais je trouve que c'est sale :

    Dans le onCreate(), je crée un progressDialogue que j'enlève à la fin du create.

    Donc il ne s'affiche jamais, mais il bloque les clicks pendant le chargement ce qui évite que si l'utilisateur click sur l'écran pendant le chargement. Le contact de la liste soit sélectionné.

    C'est pas très propre, mais c'est la seule méthode que j'ai trouvé. Avec la technique du boolean ça ne marche pas car :

    - Appel de la méthode create (bloqué)
    - Fin de la méthode create (onblock)
    - Click de l'utilisateur est envoyé à ce moment même si il à été fait avant.

    Merci

  6. #6
    Membre habitué
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 108
    Points : 163
    Points
    163
    Par défaut
    Pourquoi ne pas afficher le dialog si ton chargement prend du temps ?

    L'utilisateur verrais alors quelque chose se passer, car je pense que de ton cas, l’écran ne répond pas pendant le chargement ?

    Si cette méthode te convient c'est toi qui vois

  7. #7
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Si l'application ne répond pas ... attention aux risques d'ANR....

    D'ailleurs question bête.... pourquoi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    m_adapter = new ContactAdapter(this);
    		m_listView.setAdapter(m_adapter);
     
    		// This method get contact from system and set the result in the m_listContact list.
    		getContact();	
    		m_adapter.setListFile(m_listContact);
    		m_adapter.notifyDataSetChanged();
    		m_listView.setOnItemClickListener(contactListener);
    Au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    		// This method get contact from system and set the result in the m_listContact list.
    		getContact();	
                    m_adapter = new ContactAdapter(this);
     		m_adapter.setListFile(m_listContact);
     
                    m_listView.setAdapter(m_adapter);
    		m_listView.setOnItemClickListener(contactListener);
    Le notifyDataSetChanged() ne va pas faire grand chose vu qu'on est pas sorti du onCreate à priori... si ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  8. #8
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Ok.... je viens de comprendre....

    getContact() est en fait une fonction qui va "fetcher" les contacts, et avec gros effets de bords pour les mettre dans une liste locale... getXXXX() en général est utilisé pour renvoyer une donnée, d'ou ma confusion.... j'aurai plutot vu un nom style "fetchContacts()"

    Ne serait-il pas plus judicieux de faire cela dans un asynctask si l'opération est longue ? (avec ou non affichage de "progress").
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut
    Pourquoi ne pas afficher le dialog si ton chargement prend du temps ?
    Mon soucis était que vu que la "latence" est faite dans la méthode onCreate, il n'affichera jamais la boite de dialogue. De plus mon problème est surtout d'un point de vue utilisateur, si celui-ci clique sur l'écran pendant le chargement (3-4 secondes), le click est reporté lorsque l'UI est créer. Et donc c'est comme si il avait sélectionné directement un contact.


    getContact() est en fait une fonction qui va "fetcher" les contacts, et avec gros effets de bords pour les mettre dans une liste locale... getXXXX() en général est utilisé pour renvoyer une donnée, d'ou ma confusion.... j'aurai plutot vu un nom style "fetchContacts()"
    Ok j'ai changé le nom, c'est vrai que j'aurai pu mettre un commentaire pour expliquer ce que getContact faisait.

    Maintenant tu dis avec des gros effets de bords ? Qu'entends-tu par la ?

    Ne serait-il pas plus judicieux de faire cela dans un asynctask si l'opération est longue ? (avec ou non affichage de "progress").
    Je vais aller me documenter sur les "async task", c'est vrai qu'il n'est pas recommandé d'effectuer le traitement lourd dans l'UI. Je test ça ce soir

  10. #10
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut
    Merci, c'est beaucoup plus propre avec une progressDialogue et une async task.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MVVM] Affichage bloquer chargement listview
    Par cool17 dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 09/04/2013, 09h09
  2. bloquer les clics souris
    Par vynsse dans le forum Windows
    Réponses: 2
    Dernier message: 25/05/2007, 12h43
  3. Bloquer les clics sur une fenêtre
    Par Enzololo dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 22/05/2006, 23h12
  4. [débutant] Listview et double-clic
    Par Runlevel dans le forum C++Builder
    Réponses: 12
    Dernier message: 29/06/2004, 20h44
  5. Gérer les clics sur les boutons
    Par cyberlewis dans le forum Windows
    Réponses: 4
    Dernier message: 08/02/2004, 16h34

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