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 :

[Tutoriel] Créer une ListView avec des contrôles CheckBox et gérer les événements sur ces derniers


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 [Tutoriel] Créer une ListView avec des contrôles CheckBox et gérer les événements sur ces derniers
    Bonjour,

    Voici un nouveau tutoriel pour apprendre Android qui vous permettra de créer une listView avec des checkbox et de gérer les événements de ces dernières.

    http://dsilvera.developpez.com/tutor...er-evenements/

    Vous pouvez poser vos questions concernant ce tutoriel ici.

    Bonne lecture

    PS: N'oubliez pas de voter pour la discussion

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 38
    Par défaut list défilante
    Salut David,

    Peux-tu m'expliquer pourquoi ton tuto ne fonctionne pas si la hauteur de la liste dépasse la taille de l'écran (ce qui arrive vite) ?

    J'ai moi-même fais une appli toute simple et j'ai un problème : les checkbox changent aléatoirement au scroll.

    Si t'a la solution, merci d'avance !
    A+

  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
    Bonjour buzeeg,
    En effet, ceci n'est pas pratique. Ceci vient du fait que la position que nous renvoie getView est celle de l'item par rapport à la liste visible!

    Plusieurs solutions existent!

    La plus simple est d'afficher un objet (id, libelle) au lieu d'afficher un simple libelle. Ainsi, lorsque tu cliques sur ton item, tu seras à quel libelle cela correspond, donc à quel id qui correspond à la position. C'est une petite bidouille mais ca fonctionne!

    Sinon, il y a d'autre solution que je n'ai pas en tête la tout de suite mais je pourrais faire une mis à jour du tuto prochainement pour corriger ce bogue.

  4. #4
    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
    Bonjour à toutes et à tous,


    Je vous poste une version de code qui ne bogue pas! Comme je l'ai dit, l'astuce est d'enregistrer la position dans le tag. Voyons ceci plus précisement dans un exemple.

    Créons une classe person:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    // Posibilité de trier donc implemente comparable
    public class Person implements java.lang.Comparable
    {
    	// position = Position dans le tableau si nous faisons une liste de persone
    	private int		position;
    	private String	nom;
    	private String	prenom;
    	private boolean	checked	= false;
     
    	public Person (String nom, String prenom)
    	{
    		this.nom = nom.toUpperCase ();
    		this.prenom = prenom.toUpperCase ();
    	}
     
    	public String getNom ()
    	{
    		return nom;
    	}
     
    	public void setNom (String nom)
    	{
    		this.nom = nom;
    	}
     
    	public String getPrenom ()
    	{
    		return prenom;
    	}
     
    	public void setPrenom (String prenom)
    	{
    		this.prenom = prenom;
    	}
     
    	public void setChecked (boolean checked)
    	{
    		this.checked = checked;
    	}
     
    	public boolean isChecked ()
    	{
    		return checked;
    	}
     
    	public int compareTo(Object other) { 
    	      return this.nom.compareTo (((Eleve)other).getNom ());
    	}
     
    	public void setPosition (int position)
    	{
    		this.position = position;
    	}
     
    	public int getPosition ()
    	{
    		return position;
    	}
     
    }

    Ensuite, nous allons créer un adapter pour créer une liste:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    public class personAdapter extends BaseAdapter
    {
    	List<person>		person;
    	LayoutInflater	inflater;
     
    	public personAdapter (Context context, List<person> person)
    	{
    		inflater = LayoutInflater.from (context);
    		this.person = person;
    	}
     
    	@Override
    	public int getCount ()
    	{
    		return person.size ();
    	}
     
    	@Override
    	public Object getItem (int position)
    	{
    		return person.get (position);
    	}
     
    	@Override
    	public long getItemId (int position)
    	{
    		// TODO Auto-generated method stub
    		return position;
    	}
     
    	@Override
    	public View getView (int position, View convertView, ViewGroup parent)
    	{
    		ViewHolder holder;
    		if (convertView == null)
    		{
    			holder = new ViewHolder ();
    			convertView = inflater.inflate (R.layout.affichageitem, null);
    			holder.nom = (TextView) convertView.findViewById (R.id.nom);
    			holder.prenom = (TextView) convertView.findViewById (R.id.prenom);
    			holder.checked = (CheckBox) convertView
    					.findViewById (R.id.checkbox);
    		}
    		else
    		{
    			holder = (ViewHolder) convertView.getTag ();
    		}
    		holder.position = person.get (position).getPosition ();
    		holder.nom.setText (person.get (position).getNom ());
    		holder.prenom.setText (person.get (position).getPrenom ());
    		holder.checked.setChecked (person.get (position).isChecked ());
    		holder.checked.setClickable (false);
    		holder.checked.setEnabled (true);
    		holder.checked.setTag (holder);
    		convertView.setTag (holder);
    		return convertView;
    	}
    //Classe permettant de sauvegarder l'etat de la personne et de pouvoir recuperer la position.
    	public class ViewHolder
    	{
    		TextView	nom;
    		TextView	prenom;
    		CheckBox	checked;
    		int			position;
    	}
    }

    Enfin nous allons pouvoir initialiser et gérer notre liste dans l'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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    public class CheckActivity extends ListActivity
    {
    	/** Called when the activity is first created. */
     
    	private EditText		_filterText		= null;
    	private personAdapter	_adapter		= null;
    	private List<Person>		Person;
    	private ListView		personList;
     
    	@SuppressWarnings("unchecked")
    	@Override
    	public void onCreate (Bundle savedInstanceState)
    	{
    		super.onCreate (savedInstanceState);
    		setContentView (R.layout.main);
     
    		person = new ArrayList<person> ();
    		person.add (new person ("Toto", "Toti"));
    		person.add (new person ("Tata", "Titi"));
    		person.add (new person ("Padre", "Papa"));
    		person.add (new person ("Mum", "Maman"));
    		person.add (new person ("Aba", "ima"));
    		person.add (new person ("Mickey", "Mouse"));
    		person.add (new person ("Mini", "Mouse"));
    		person.add (new person ("Testeur", "Pro"));
    		person.add (new person ("Developpez", "Forum"));
    		person.add (new person ("Voilou", "Voili"));
     
    		Collections.sort (person);
     
    		// Initialisation de la position
    		for (int i = 0; i < person.size (); i++)
    			person.get (i).setPosition (i);
     
    		_adapter = new personAdapter (this, person);
    		setListAdapter (_adapter);
    		personList = getListView ();
    		personList.setItemsCanFocus (false);
    		personList.setOnItemClickListener (new OnItemClickListener ()
    		{
     
    			@Override
    			public void onItemClick (AdapterView<?> parentView,
    					View selectedItemView, int position, long id)
    			{
    				CheckBox c = (CheckBox) selectedItemView
    						.findViewById (R.id.checkbox);
    //On recupere le tag
    				ViewHolder view = ((ViewHolder) c.getTag ());
    //On gere le check
    				if (!c.isChecked ())
    				{
    					person.get (view.position).setChecked (true);
    				}
    				else
    				{
    					person.get (view.position).setChecked (false);
    				}
    //On replace la liste à la bonne position
    				int pos = parentView.getFirstVisiblePosition ();
    				personList.setSelection (pos);
    			}
    		});
    	}
    }
    Et voila

    Voici le xml d'un item affichageitem.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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 
    	xmlns:android="http://schemas.android.com/apk/res/android"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content" android:orientation="horizontal"
    	>
     
    	<ImageView 
    		android:id="@+id/img" 
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content" 
    		android:layout_gravity="center_vertical"
    		android:src="@drawable/profil_homme" android:layout_marginRight="10px"/>
     
    	<LinearLayout
    		android:layout_height="wrap_content" 
    		android:layout_gravity="center_vertical"
    		android:paddingLeft="10px" 
     
    		android:orientation="vertical" 
    		android:layout_width="wrap_content" android:layout_weight="1">
     
    		<LinearLayout
    			android:layout_height="wrap_content" 
    			android:layout_gravity="center_vertical" 
    			android:layout_width="wrap_content" 
    			android:orientation="horizontal" >
     
    			<TextView 
    				android:id="@+id/nom" 
    				android:layout_width="fill_parent"
    				android:layout_height="fill_parent" 
    				android:textSize="20sp"
    				android:textStyle="bold" 
    				android:text="Nom" 
    				android:layout_marginRight="10px"/>
     
    			<TextView 
    				android:id="@+id/prenom"
    				android:layout_width="fill_parent" 
    				android:textSize="20sp"
    				android:layout_height="fill_parent" 
    				android:text="Prenom" />
     
    		</LinearLayout>
     
    	</LinearLayout>
     
    	<CheckBox 
    		android:id="@+id/checkbox" 
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content" 
    		android:layout_weight="0" 
    		android:layout_marginRight="10px" android:layout_gravity="center_vertical"
    		android:focusable="false"
    		android:focusableInTouchMode="false" />
     
    </LinearLayout>
    Voici le main.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:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">
     
     
        <ListView android:id="@android:id/list"
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1" 
             /> 
     
    </LinearLayout>

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Février 2008
    Messages
    658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 658
    Par défaut
    Parfait... sauf que ton style de code ressemble à un developpeur en C!
    Tout les classes en Java sont fortement conseillé d'avoir une lettre Majuscule comme debut!

    person, personAdapter ne respectent pas la convention de style Java...

    // Initialisation de la position
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	for (int i = 0; i < person.size (); i++){
    			person.get (i).setPosition (i);
                      ....
    }
    Pour un mobile, il faut aussi penser à l'optimisation par :


    // Initialisation de la position
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     int personLenght=person.size ();
    		for (int i = 0; i < personLenght; i++){
    			person.get (i).setPosition (i);
     
    }

  6. #6
    Invité de passage
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 1
    Par défaut
    Bonjour,

    J'ai testé la version de base qui bug comme expliqué selon la position.
    J'ai ensuite essayé la correction proposée ici, mais les items ne se checked pas du tout. Je clique bien sur l'item, je fais un log pour voir s'il rentre bine dans la fonction
    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
    public void onItemClick(AdapterView<?> parentView,
    					View selectedItemView, int position, long id) {
    				CheckBox c = (CheckBox) selectedItemView
    						.findViewById(R.id.checkbox);
    				// On recupere le tag
    				ViewHolder view = ((ViewHolder) c.getTag());
    				// On gere le check
    				if (!c.isChecked()) {
    					persons.get(view.position).setChecked(true);
    					Log.v("Checked", "true");
     
    				} else {
    					persons.get(view.position).setChecked(false);
    					Log.v("Checked", "false");
    				}
    les log s'affichent bien ( toujours en true) mais rien de changent sur l'interface...


    EDIT : bon en fait il suffisait de modifier un peu le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if (!c.isChecked()) {
    					c.setChecked(true);
    					persons.get(view.position).setChecked(true);
    					Log.v("Checked", "true" + position);
     
    				} else {
    					c.setChecked(false);
    					persons.get(view.position).setChecked(false);
    					Log.v("Checked", "false" + position);
    				}
    Par contre je comprends pas trop comment ça fonctionne du coup ...
    Parce que la checkbox est récupéré par
    CheckBox c = (CheckBox) selectedItemView.findViewById(R.id.checkbox);
    et selectedItemView correspond au linearlayout j'imagine?

Discussions similaires

  1. Créer une ListView avec des radio button ?
    Par KTARIK dans le forum Composants graphiques
    Réponses: 6
    Dernier message: 06/05/2013, 17h08
  2. [Débutant] Créer une boucle avec des checkbox
    Par Shennong dans le forum VB.NET
    Réponses: 2
    Dernier message: 19/07/2012, 15h00

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