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 :

CheckBox dans une liste


Sujet :

Android

  1. #1
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut CheckBox dans une liste
    Bonjour à tous et à toutes,


    Je possède une vue ayant une liste. Dans chaque élément de ma liste, j'ai une checkbox.

    Voici mon code:

    detail_liste.xml:

    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="horizontal" android:layout_width="fill_parent"
    	android:layout_height="wrap_content">
     
    <TextView android:textSize="20sp" 
    android:id="@+id/text"
    			 android:layout_width="wrap_content" android:layout_height="wrap_content"
    			android:layout_marginLeft="5sp" />
     
    <CheckBox android:layout_height="wrap_content" android:id="@+id/checkOK"
    				android:layout_width="wrap_content" android:layout_gravity="right"
    				android:layout_marginRight="10sp" />
     
    </LinearLayout>
    liste_view.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
     
    	<ListView android:id="@+id/listview" android:layout_width="fill_parent"
    		android:layout_height="fill_parent" android:layout_weight="1" />
    </LinearLayout>
    Dans mon activity:
    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
    18
    19
     
    ListView list = (ListView) findViewById(R.id.listview);
     
    		ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();
     
    		HashMap<String, String> map;
     
    		map = new HashMap<String, String>();
    		map.put("text", "toto");
    		listItem.add(map);
     
    		map = new HashMap<String, String>();
    		map.put("text", "tata");
    		listItem.add(map);
     
    		SimpleAdapter mSchedule = new SimpleAdapter(this.getBaseContext(),
    				listItem, R.layout.detail_liste, new String[] { "text" }, new int[] { R.id.text });
     
    		listZone.setAdapter(mSchedule);

    Ma question est simple. J'aimerai pouvoir controler mes checkbox. C'est à dire savoir si elles sont cochées ou non, définir un événement onclick sur chacune d'entre elle.
    Cependant, je n'ai aucune idée de comment les récupérer et comment définir un événement globale pour toutes les checkbox de ma liste.


    Quelqu'un aurait une idée?

    Faut il utiliser autre chose qu'une activity? listActivity ou autre? Dans ce cas comment faire?

    EDIT: Après plusieurs recherche, j'ai vu qu'il était possible de redéfinir le SimpleAdapter afin de récupérer mes checkbox! Cependant, je n'ai aucune idée de comment faire


    Merci d'avance

  2. #2
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Première solution mettre un listener sur tes checkbox dans ton adapter de ta listView.

    Deuxième solution dans ton fichier xml tu mets le paramètre onClick sur tes checkbox qui appelle une procédure .

    Dans les deux cas lorsque tu récupères l'évènement tu récupères le tag de ta view que tu avait préalablement ajouter lors de la construction de ta view .

    Avec le tag tu connaîtra la position de ta checkbox et tu pourras aussi définir sa valeur.


    Après il ne me semble pas qu'il existe une méthode globale sur les évènement des composant dans une listeview.
    Une autre piste serait de redéfinir la class CheckBox en redéfinissant la classe et en implémentant un appel à un handler lorsque la valeur change. Ou pourrait le voir aussi avec un observer.

  3. #3
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Merci beaucoup pour ces multiples réponses!

    Je vais essayer


    EDIT: J'ai choisi de mettre un événement onClick dans ma checkbox!

    Dans mon layout j'ajoute sur ma checkbox : android:onClick="myClickHandler"

    Ensuite, dans mon activity je défini la fonction comme ceci:
    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
     
    public void myClickHandler(View v) {
    		Log.d("CONFORMITE", "CHECK");
     
    		if (((CheckBox)v).isChecked())
    			DisplayToast("is checked");
    		else
    			DisplayToast("is not checked");
    	}
     
     
        private void DisplayToast(String msg)
        {
             Toast.makeText(getBaseContext(), msg, 
                     Toast.LENGTH_SHORT).show();        
        }
    Ceci fonctionne tres bien! Lorsque je clique sur ma checkbox ca m'affiche le bon message.

    Cependant, comment savoir quelle checkbox j'ai coché?

    Je suppose qu'il faut utiliser les tags. Donc dans ma fonction j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object id = v.getTag();
    Cependant, dans mon xml au niveau de ma checkbox je ne sais pas quoi écrire dans le tag:
    Merci pour cette solution en tout cas

  4. #4
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    En fait le tag tu pourras le saisir dans le GetView de ton adapter , c'est en ce moment que tu pourra rentrer la position de la checkbox dans le tag.


    Après sinon tu peux toujours essayer cela où lorsque la checkbox est cliqué tu regardes quel item de ta listview est sélectionné , cela te permettra je pense de connaître la position de ta checkbox , a voir si l'item de la listview se met a jour lors d'un click sur ta checkbox.

    Essaye les deux solutions je pense que la deuxième est plus facile à mettre en place , la première reste plus sûre .

  5. #5
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    J'ai ajouter un tag dans mon code comme ceci:

    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
    18
    19
    20
    21
     
    ListView list = (ListView) findViewById(R.id.listview);
     
    		ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();
     
    		HashMap<String, String> map;
     
    		map = new HashMap<String, String>();
    		map.put("text", "toto");
    		map.put("tag", 0);		
                    listItem.add(map);
     
    		map = new HashMap<String, String>();
    		map.put("text", "tata");
    		map.put("tag", 1);
    		listItem.add(map);
     
    		SimpleAdapter mSchedule = new SimpleAdapter(this.getBaseContext(),
    				listItem, R.layout.detail_liste, new String[] { "text", "tag" }, new int[] { R.id.text, R.id.tag });
     
    		listZone.setAdapter(mSchedule);
    Dans mon xml, j'ai ajouté dans ma check box:
    Ceci ne fonctionne pas!

    Ca m'affiche toujours false!


    En fait le tag tu pourras le saisir dans le GetView de ton adapter , c'est en ce moment que tu pourra rentrer la position de la checkbox dans le tag.
    De quel GetView s'agit t il!
    Je redéfini l'adaptater du coup?



    Après sinon tu peux toujours essayer cela où lorsque la checkbox est cliqué tu regardes quel item de ta listview est sélectionné , cela te permettra je pense de connaître la position de ta checkbox , a voir si l'item de la listview se met a jour lors d'un click sur ta checkbox.
    Ceci ne fonctionne pas car l'événement onClickItem n'est pas appelé lors du clique sur la checkBox

  6. #6
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    J'ai bien avancé au niveau des tags. Voici e que j'ai fait:
    J'ai créé une classe pour redéfinir mon adaptater:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    public class myListAdapter extends SimpleAdapter{
    	private Context context;
    	private LayoutInflater mInflater;
     
     
    	public myListAdapter(Context context,
    			List<? extends Map<String, ?>> data, int resource, String[] from,
    			int[] to) {
    		super(context, data, resource, from, to);
    		this.context = context;
    		mInflater = LayoutInflater.from(context);
     
    	}
     
    	@Override
    	public Object getItem(int position) {
    		return super.getItem(position);
    	}
     
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    		convertView = mInflater.inflate(R.layout.conformite_liste, null);
    		//récupére ma checkbox
    		CheckBox cb = (CheckBox) convertView.findViewById(R.id.check);
    		//affecte la position de l'item comme tag
    		cb.setTag(position);
    		return super.getView(position, convertView, parent);
    	}	
     
    }

    Ensuite, dans mon activity je remplace SimpleAdapter par myListAdapter.

    Ma méthode myClickHandler (appelée lors du clique sur une checkbox) ressemble maintenant à ceci:

    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
    public void myClickHandler(View v) {
    		CheckBox cb = (CheckBox)v;
    		int position = Integer.parseInt(cb.getTag().toString());
    		View o = (View)listConformite.getItemAtPosition(position);
     
    		if (cb.isChecked())
    		{
    			cb.setBackgroundResource(R.color.green);
    			DisplayToast("is checked : " + position);
    		}
    		else
    		{
    			cb.setBackgroundResource(R.color.blue);
    			DisplayToast("is not checked : " + position);
    		}
    	}
    Mon tag fonctionne parfaitement! Mon problème est que je n'arrive pas à récupérer l'item afin de lui modifier son fond d'écran. La ligne qu'il aime pas est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    View o = (View)listConformite.getItemAtPosition(position);
    L'erreur logcat est :
    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
    18
    19
    20
    21
    22
    23
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888): FATAL EXCEPTION: main
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888): java.lang.IllegalStateException: Could not execute method of the activity
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at android.view.View$1.onClick(View.java:2072)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at android.view.View.performClick(View.java:2408)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at android.widget.CompoundButton.performClick(CompoundButton.java:99)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at android.view.View$PerformClick.run(View.java:8816)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at android.os.Handler.handleCallback(Handler.java:587)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at android.os.Handler.dispatchMessage(Handler.java:92)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at android.os.Looper.loop(Looper.java:123)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at android.app.ActivityThread.main(ActivityThread.java:4627)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at java.lang.reflect.Method.invokeNative(Native Method)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at java.lang.reflect.Method.invoke(Method.java:521)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at dalvik.system.NativeStart.main(Native Method)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888): Caused by: java.lang.reflect.InvocationTargetException
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at com.android.MyActivity.myClickHandler(MyActivity.java:90)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at java.lang.reflect.Method.invokeNative(Native Method)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at java.lang.reflect.Method.invoke(Method.java:521)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     at android.view.View$1.onClick(View.java:2067)
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     ... 12 more
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888): Caused by: java.lang.ClassCastException: java.util.HashMap
    07-05 11:37:01.681: ERROR/AndroidRuntime(1888):     ... 16 more
    Voyez vous d'où viens l'erreur?

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 322
    Par défaut
    Citation Envoyé par David55 Voir le message
    Ceci ne fonctionne pas car l'événement onClickItem n'est pas appelé lors du clique sur la checkBox
    As tu essayé avec le listener setOnCheckedChangeListener ?

  8. #8
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Citation Envoyé par AndroChristophe Voir le message
    As tu essayé avec le listener setOnCheckedChangeListener ?
    Bonjour,

    Sur quel element applique tu ceci?


    Enfin, mon problème n'est plus exactement le même! Ma ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    View o = (View)listConformite.getItemAtPosition(position);
    M'envoie une erreur alors que "position" a une valeur correct

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 322
    Par défaut
    Il s'applique au checkbox.

    Pour ton problème, peux tu me montrer la déclaration (et initialisation) de listConformite. Car tu essayes de le caster en View et on dirait qu'il n'y arrive pas.

  10. #10
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    ListConformite est une listView récupérer grace à getListView() (je suis dans une listActivity)

    Cependant, je fais un getItemAtPosition donc je suis censé récupérer un seul élément de ma listView donc une View!
    J'ai tord?

  11. #11
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    J'ai trouvé!

    Il suffisait d'utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     	View o = listConformite.getChildAt(position);

    Merci à vous deux

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

Discussions similaires

  1. [AJAX] checkbox dans une liste + autocomplétion
    Par biggyboy dans le forum AJAX
    Réponses: 1
    Dernier message: 12/08/2009, 10h45
  2. Checkbox dans une liste d'objets
    Par Flackou dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 20/01/2009, 18h13
  3. Réponses: 3
    Dernier message: 14/05/2008, 11h58
  4. Réponses: 7
    Dernier message: 08/08/2007, 13h04
  5. Checkbox dans une list ?
    Par walou dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 31/07/2007, 02h26

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