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 :

Tester les checkBox dans une listview avecun SimpleCursorAdapter


Sujet :

Composants graphiques Android

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Tester les checkBox dans une listview avecun SimpleCursorAdapter
    Bonjour à tous.

    C'est mon premier post ici. J'espère n'avoir pas fait de bêtises (oubli ou autre).
    Je vous explique mon soucis.

    J'ai creer un programme qui affiche dans une listview ce qui est contenu en base de donnée Sqlite. J'ai une action bar avec dans un menu un bouton qui doit supprimer toutes les entrées marquées par une checkbox coché.

    Pour celà, à l'appui du bouton, je parcours ma liste et je doit faire un test sur chaque checkbox. Problème, comment récupérer ce checkbox... je ne peux pas mettre un bête findViewById, puisqu'il n'est pas dans le même xml que celui déclarer par setContentView();

    Je vous met en code un version allégé de l'appli. Si vous pourriez me donner un coup de main. J'ai pas mal chercher, apparemment il faut modifier le simpleCursorAdapter pour avoir un getView spécifique.

    Je suis un peu perdu. La panne se situe dans le switch case, j'ai essayé plusieurs choses. Je laisse mes erreurs en commentaires.

    Voici mon code
    main.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
     
    </LinearLayout>
    list_row.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
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"
        android:descendantFocusability="blocksDescendants" >  
     
        <LinearLayout 
        android:id="@+id/linearLayout"  
    	 android:layout_width="wrap_content"
    	android:layout_height="fill_parent"
    	 android:layout_alignParentLeft="true"
    	 android:layout_alignParentTop="true">
     
         <CheckBox 
    				android:id="@+id/check"
    				android:layout_marginLeft="10dp"
    				android:layout_marginTop="20dp"
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content" />
         </LinearLayout>
     
         <LinearLayout
             android:id="@+id/linearLayout1"
             android:layout_width="wrap_content"
             android:layout_height="fill_parent"
             android:layout_alignParentRight="true"
             android:layout_alignParentTop="true"
             android:layout_toRightOf="@+id/linearLayout" >
     
       <TextView
           android:id="@+id/text1"
           android:layout_width="291dp"
           android:layout_height="70dp"
           android:padding="18dp"     
           android:textSize="35sp"
           android:textColor="#4F4F4F" />  
     
    	<TextView
        android:id="@+id/text2"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:textSize="25sp"
         />
     
    	</LinearLayout>
    </RelativeLayout>
    note_list.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
    <?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="wrap_content">
     
        <ListView
            android:id="@android:id/list"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"       
            android:listSelector="@drawable/list_selector_flatcolor"
            android:dividerHeight="1dp"
            android:choiceMode="multipleChoice"
             />
     
      	<TextView android:id="@+id/android:empty"
              android:layout_width="wrap_content"
            	android:layout_height="wrap_content"
            	android:text="@string/no_notes"
            	android:textSize="30sp"
            	android:layout_marginLeft="100dp"
            	android:layout_marginTop="100dp"/>
    </LinearLayout>
    Main.java
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.notes_list);
            mDbHelper = new NotesDbAdapter(this);
            mDbHelper.open();
            fillData();
     
        }
     
        private void fillData() {
     
            Cursor notesCursor = mDbHelper.fetchAllNotes();
            startManagingCursor(notesCursor);
     
            String[] from = new String[]{NotesDbAdapter.KEY_ND, NotesDbAdapter.KEY_NOM };
     
            int[] to = new int[]{R.id.text1, R.id.text2};
            notes = new CheckboxAdapter(this, R.layout.notes_row, notesCursor, from, to);
            setListAdapter(notes);
     
        }
     
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            super.onCreateOptionsMenu(menu);        
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.menucourt, menu);
     
     
            return true;
        }
     
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch(item.getItemId()) {
                case R.id.add:
                   createNote();
                    return true;          
                case R.id.suppsel:
                	 ListView lv = getListView();
                	 for(int i=0; i<=lv.getCount(); i++){   
                		 //View v= lv.getChildAt(i);
                		 //CheckBox cbx = (CheckBox)v.findViewById(R.id.check);
                         /*if(cbx.isChecked()){
                        	 System.out.println("Oui");
                        }*/
                		 //System.out.println(lv.getAdapter().getItem(i));
                		 //mDbHelper.deleteNote(lv.getItemIdAtPosition(i)); pour supprimé l'entrée à chaque tour         		 
                		 //System.out.println(notes.stateCheck(i));
                			 //System.out.println("Oui");
                	 }
                     /*int position1 = lv.getPositionForView(v);
                     System.out.println(position1);
                     CheckBox cd = (CheckBox) v.findViewById(R.id.check);
                     if(cd.isChecked())
                     		System.out.println("yes");*/
                	return true;
            }
     
            return super.onOptionsItemSelected(item);
        }
     
     
     
     
     
                case DELETE_ID:
                    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
                    System.out.println(info.id);
                    mDbHelper.deleteNote(info.id);
                    fillData();
                    return true;
                case delete_all:
                	alertDialog = new AlertDialog.Builder(Notepadv3.this).create();
                	alertDialog.setTitle("Confirmation suppression");
                	alertDialog.setMessage("Etes vous sur(e) de vouloir tout supprimer?");
                	alertDialog.setButton("Annuler", new DialogInterface.OnClickListener() 
                	{
                		public void onClick(DialogInterface dialog, int which) 
                		{
                			alertDialog.dismiss(); 	                 	 
                	    } 
                	});
                	alertDialog.setButton2("Valider", new DialogInterface.OnClickListener() 
                	{
                		public void onClick(DialogInterface dialog, int which) 
                		{          	    	 
                	    	mDbHelper.delete_all();
                            fillData(); 
                	    } 
                	});
     
                	 alertDialog.show(); 
     
            }
            return super.onContextItemSelected(item);
        }
     
        private void createNote() {
            Intent i = new Intent(this, creationbox.class);
            startActivity(i);        
        }
     
        @Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
            super.onListItemClick(l, v, position, id);
            Intent i = new Intent(this, NoteEdit.class);
            i.putExtra(NotesDbAdapter.KEY_ROWID, id);
            startActivityForResult(i, ACTIVITY);
     
        }
     
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
            super.onActivityResult(requestCode, resultCode, intent);
            fillData();
        }
     
    }
    Je suis curieux de savoir ou est mon erreur et comment la résoudre. Je pense à un soucis de View...
    Merci d'avance.

  2. #2
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 4
    Points
    4
    Par défaut solution
    Solution trouvée!

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ListView lv = getListView();
    for(int i=0; i < lv.getChildCount(); i++)
          {
            CheckBox cb = (CheckBox)lv.getChildAt(i).findViewById(R.id.check); 
            if(cb.isChecked())
                {
                    cb.setChecked(false);
                }
            else
                {
                    cb.setChecked(true);
                }
          }
    Il faut instancier le checkbox suivant la listview.

  3. #3
    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
    En fait la solution "propre" est de remonter l'information "checked" au niveau de l'item (hériter de RelativeLayout par exemple, bien que je ne voie pas trop l'intérêt d'un RelativeLayout ici, mais je dois être fatigué, et implémenter le state "checked"). La checkbox servant juste "d'interface" avec l'item.

    Ensuite utiliser une ListView en mode "multi-selection", et juste lui demander getSelectedItems()

  4. #4
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonsoir,

    J'en conviens c'est pas propre, et dans le but d'optimisé mon code (j'adore faire ça), je souhaite savoir comment je peux faire avec getSelectedItems().

    J'ai trouvé quelque piste avec getSelectedItems() mais jamais réussi à mettre ça en place.

    Est-ce que je peux avoir un lien, ou un bout de code.

  5. #5
    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
    Alors... pour qu'un item soit "checkable" il faut "remonter" le state "checked" au niveau de la view représentant l'item, et surtout, bien sur, que cette "view" implémente: Checkable

    Voici un exemple de layout implémentant le state "checked": https://gist.github.com/christopherperry/3746480

    L'interêt de "Checkable" est l'utilisation dans une ListView marquée comme multi-selection (android:choiceMode="multipleChoice")
    Ensuite on récupère les items "checkés" avec: getCheckedItemIds() ou getCheckedItemPositions()

    L'interêt du state android.R.attr.state_checked est l'utilisation dans les selector de ressource pour représenter la view (background...).

Discussions similaires

  1. Modifier les données dans une listview
    Par nomade333 dans le forum VBA Access
    Réponses: 2
    Dernier message: 16/01/2010, 16h56
  2. Cocher toutes les checkBox dans une dataGridView
    Par jeandadaf dans le forum VB.NET
    Réponses: 3
    Dernier message: 28/10/2009, 18h27
  3. [VB6] Filtrer les éléments dans une listview
    Par jfdmagic dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 26/06/2009, 12h56
  4. Réponses: 3
    Dernier message: 23/04/2009, 01h56
  5. Lister les processus et les PID dans une listview .
    Par maxoudu328 dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 16/10/2005, 17h03

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