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 :

ListView et CheckBox


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 2
    Par défaut ListView et CheckBox
    Bonjour à tous,

    Alors voilà, j'ai une listview composée de plusieurs rows contenant un textview et une checkbox, grâce à ce tutoriel: http://dsilvera.developpez.com/tutor...er-evenements/
    Lorsque je clique sur une checkbox, ça me renvoie le bon textview, cependant lorsque je scroll la view, je remarque que d'autre checkbox ont été cochées, et en scrollant de haut en bas, je remarque que les checkbox se check et uncheck un peu partout.

    Voici le code bout de code que j'utilise pour afficher, lorsque l'on check ou uncheck une checkbox:

    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 MyHandler(View v) {
    		CheckBox cb = (CheckBox) v;
     
    		int position = Integer.parseInt(cb.getTag().toString());
     
    		@SuppressWarnings("unchecked")
    		HashMap<String, Object> map = (HashMap<String, Object>) customListView.getItemAtPosition(position);
     
    		if (cb.isChecked()) {
    			Toast.makeText(this, map.get("livret").toString(), Toast.LENGTH_SHORT).show();
    		} else {
    			Toast.makeText(this, "unchecked", Toast.LENGTH_SHORT).show();
    		}
        }
    J'ai essayé d'utiliser les viewHolder mais je ne vois pas trop comment m'en servir et si c'est la bonne direction à prendre ou pas.

  2. #2
    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
    Ca serait pas un probleme de mutation ?
    (personnellement je n'ai pas ce probleme avec le text+checkbox qui vient par défaut avec android: simple_list_item_single_choice)

    http://developer.android.com/resourc...mutations.html

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 2
    Par défaut
    Bonjour merci de votre réponse,

    J'ai regardé les mutations, cela ne s'utilise pas juste avec des drawables ?
    Désolé je suis débutant en programmation.

    Par contre j'ai essayé de changer mon code en utilisant les ViewHolder. En creant une classe nouvelle classe.
    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
     
    public class MyAdapter extends BaseAdapter {
    	List<Banque> banque;
    	LayoutInflater inflater;
     
    	public MyAdapter(Context context,List<Banque> banque) {
     
    		inflater = LayoutInflater.from(context);
    		this.banque = banque;
     
    	}
    	public int getCount() {
    		// TODO Auto-generated method stub
    		return banque.size();
    	}
     
    	public Object getItem(int position) {
    		// TODO Auto-generated method stub
    		return banque.get(position);
    	}
     
    	public long getItemId(int position) {
    		// TODO Auto-generated method stub
    		return position;
    	}
    	private class ViewHolder {
    		ImageView logo;
    		TextView livret;
    		CheckBox checkBox;
    		}
     
    	public View getView(final int position, View convertView, ViewGroup parent) {
    		final ViewHolder holder;
    		if(convertView == null) {
     
    			holder = new ViewHolder();
    			convertView = inflater.inflate(R.layout.listebanque, null);
    			holder.logo = (ImageView) convertView.findViewById(R.id.logoBanque);
    			holder.livret = (TextView) convertView.findViewById(R.id.livretBanque);
    			holder.checkBox = (CheckBox) convertView.findViewById (R.id.checkBanque);
    			convertView.setTag(holder);
    			holder.checkBox.setTag(banque.get(position));
    		}else
    			holder = (ViewHolder) convertView.getTag();
     
    		holder.logo.setImageBitmap(banque.get(position).getLogo());
    		holder.livret.setText(banque.get(position).getLivret());
    		holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    			public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){
     
    				if(buttonView.isChecked())
    					System.out.println(banque.get(position).getLivret());
    				else
    					System.out.println("unselected");
    			}
    		});
     
    		return convertView;
    	}
    }
    J'obtiens toujours le même problème (check et uncheck un peu partout) sauf que cette fois mon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(banque.get(position).getLivret());
    me renvoie bien le bon livret et pas un autre.

    De plus qu'est ce qu'est "simple_list_item_single_choice" en implémentant ça je pourrais avoir accès à mes checkbox ?

  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 à tous et à toutes,

    Je remonte se poste car je viens de m’apercevoir qu'un problème survient effectivement dans mon tutoriel lorsque l'on peut scroller la listView!

    Effectivement, lorsque nous scrollons la listView, la position de la fonction getView (int position, View convertView, ViewGroup parent) dans notre SimpleAdapter redéfini ne s'incrémente plus mais recommence à 0!

    Nous avons donc plusieurs lignes avec le même tag!

    Je suis en ce moment même à la recherche de la solution la plus simple. Si quelqu'un la trouve n'hésitez pas à le poster ici.

    Je vous tiens au courant le plus vite possible!

  5. #5
    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
    Je viens de regarder le tutoriel....
    Effectivement, ca va buguer !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    View  getChildAt(int index)
    est une fonction de ViewGroup et n'a aucun rapport avec les adapters, l'index n'est absoluement pas lié à la position (enfin... rien ne l'y oblige en tout cas).

    Je ne connais pas de fonction pour récupérer le item-view à partir d'une position...
    Par contre, il est possible de passer la position comme tag à l'item-view
    Et de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    View  findViewWithTag(position)
    si le même tag est donné à la checkbox et à l'item-view... on peut alors récupérer l'item-view avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ListView lv = ...;
    CheckBox cb = ....;
     
    View itemView = lv.findViewWithTag(cb.getTag());
    A ce sujet, dans l'adapter vous faites:
    Un IDE bien règlé mettrait toute de suite un warning pour automatic boxing (transformation automatique du code en: cb.setTag(new Integer(position)) ).
    Ce qui aide pour le code correspondant dans l'activity:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int position = Integer.parseInt(cb.getTag().toString());
    devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int position = ((Integer) cb.getTag()).intValue();
    (ce qui évite une transformation en String, puis une relecture de la String en Integer)... Juste éventuellement rajouer un test sur le tag, histoire de pas avoir de NPE dans des cas bizarres...

  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
    Bonjour et merci pour cette correction! Je la prendrais en compte lorsque je ferai la MAJ du tuto.


    Ceci étant cela ne règle malheureusement pas le problème! Avec un peu plus de teste, on remarque que getView attribue la même position à plusieurs ligne! Ce qui provoque un conflit!

    De plus, lorsque nous cochons une checkBox, une autre est cochée plus bas! Ceci ne provient pas du code car si nous enlevons toutes la partie code et que nous ne gérons pas la sélection de la checkbox, la même erreur apparait!


    Je continue à chercher!

Discussions similaires

  1. ListView + Header Checkbox
    Par Erakis dans le forum Windows Forms
    Réponses: 5
    Dernier message: 28/02/2008, 13h58
  2. [VB.NET] Problème ListView avec checkbox
    Par elkidos dans le forum Windows Forms
    Réponses: 1
    Dernier message: 15/02/2007, 15h27
  3. Listview avec checkboxes (récupérer cocher)
    Par Ardely dans le forum Delphi
    Réponses: 3
    Dernier message: 08/01/2007, 17h01
  4. [VB.NET] Listview avec checkboxes
    Par Tiib_CD dans le forum Windows Forms
    Réponses: 8
    Dernier message: 05/12/2006, 09h23
  5. [C#.NET] ListView et Checkboxes, Help !
    Par TheParadoX dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/08/2006, 14h00

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