CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Android BTS : Problème CheckBox dans ListView

iLeViiSxL
iLeViiSxL
Niveau 6
14 mars 2017 à 17:42:09

Bonjour,

Je me permet de vous exposer mon problème. Je suis actuellement en BTS informatique et je dois faire un projet pour mon examen final. C'est une application sur Mobile qui doit recevoir des informations d'une BDD.

Mon problème est que j'ai une listView constituer d'un adapter personnalisé. Dans mon adapter pour chaque éléments il y a du Text et une checkBox. Mon but est de pouvoir cocher une des CheckBox n'importe quand grâce à un bouton qui est situé à l’extérieur de ma listView. J'ai donc créé un tableau de checkBox(toutes les checkBox présentent dans la listView) et un tableau de booléan (pour savoir quand une checkBox est cochée).

Le problème est que si je ne vois pas (que je ne suis pas sur la vue) des checkBox que je veux cocher grâce au bouton extérieure (Par exemple si la checkBox est tout en bas de la liste et que moi je suis en haut), ça va cocher des checkBox au hasard dans ma vue actuelle (les checBox que je vois à l'écran) et pas celle que je souhaite qui sont plus bas par exemple.

Je sais pas si j'ai été assez clair :/

Voici le code de ma View au cas ou :/


    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            LayoutInflater inflater = (LayoutInflater) selectActivity.getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.station_list_item, null);
        }

        //Handle TextView and display string from your list
        TextView textViewListNomStation = (TextView)view.findViewById(R.id.textViewListNomStation);
        //Log.i(tag, "nom :" +infosStationsCapteurs.cInfosStationArrayList.get(position).getNomStation() );
        textViewListNomStation.setText(infosStationsCapteurs.getcInfosStationArrayList().get(position).getNomStation() + " ID : " + infosStationsCapteurs.getcInfosStationArrayList().get(position).getIdStation());

        TextView textViewListInfosStation = (TextView)view.findViewById(R.id.textViewListInfosStation);
        String formatInfos = "Lat : " + infosStationsCapteurs.getcInfosStationArrayList().get(position).getPositionGPS().getLatitude() + " Lon : " + infosStationsCapteurs.getcInfosStationArrayList().get(position).getPositionGPS().getLongitude();
        textViewListInfosStation.setText(formatInfos);

        //Handle buttons and add onClickListeners
        CheckBox checkBoxStation = (CheckBox) view.findViewById(R.id.checkBoxStation);
        checkBoxTab[position] =  checkBoxStation;

        checkBoxTab[position].setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//                Log.i(tag, "Bouton :" + buttonView.getId() + " Status " + isChecked);
                if (isChecked == true)
                {
                    mCheckedState[position]=true;
                    selectActivity.getTableauCapteurs().addHashSetstationChecked((cInfosStation)getItem(position));
                    selectActivity.getTableauCapteurs().createTable();
                }
                if (isChecked == false){
                    mCheckedState[position]=false;
                    selectActivity.getTableauCapteurs().deleteHashSetstationChecked((cInfosStation)getItem(position));
                    selectActivity.getTableauCapteurs().createTable();
                }
            }
        });

        checkBoxTab[position].setChecked(mCheckedState[position]);
        return view;
    }

Merci Beaucoup :)

Bunyan
Bunyan
Niveau 17
14 mars 2017 à 17:58:02

Je n'ai pas encore lu ton code, je ne pourrai le faire que demain.

Par contre, je peux déjà te donner comme piste de bien séparer tes données et leur représentation. Tu n'as pas du tout besoin d'un tableau de booléen pour savoir si les checkbox sont cochées : modifie tes données et adapte tes affichages en conséquences.

iLeViiSxL
iLeViiSxL
Niveau 6
15 mars 2017 à 09:16:40

Voici une image qui montre le problème. Si je veux cocher celui en bas il va cocher celui du haut à la place

https://image.noelshack.com/fichiers/2017/11/1489565792-usm6fff.png

LEpigeon-888
LEpigeon-888
Niveau 12
15 mars 2017 à 10:15:04

Tu ne doit pas stocker tes vues dans une liste, ça sert a rien, quand quelque chose dans ta liste change tu appelles "notifyDatasetChanged' (truc du genre) dans ton adapter et tu recrée les vues avec les nouvelles informations.

Message édité le 15 mars 2017 à 10:15:27 par LEpigeon-888
iLeViiSxL
iLeViiSxL
Niveau 6
15 mars 2017 à 10:28:09

D'accord merci mais comment faire pour recréer ma vue ?
Merci :)

LEpigeon-888
LEpigeon-888
Niveau 12
15 mars 2017 à 10:32:35

Bah de la même manière que quand tu la créé pour la première fois.

iLeViiSxL
iLeViiSxL
Niveau 6
15 mars 2017 à 10:40:22

Oui mais la vue se créer automatiquement quand on scroll la listView

LEpigeon-888
LEpigeon-888
Niveau 12
15 mars 2017 à 10:44:39

Je suis pas vraiment sur de comprendre de quoi tu parles, enfin quel est le problème avec ça quoi.

Bunyan
Bunyan
Niveau 17
15 mars 2017 à 12:05:26

Ouaip, la vue se crée automatiquement à partir de tes données, c'est comme ça que ça fonctionne.
Donc si tu veux que ta vue se mette à jour, mets simplement à jour tes données, et dans la méthode d'affichage de tes cellules, prend en compte les divers états.

Je te suggère de lire et de bien comprendre la documentation sur le recyclage de cellule, ainsi que sur les ListView et les RecyclerView.
Ton souci ici présent vient du fait que tu ne fais pas confiance à Android pour qu'il réalise de lui-même le rendu de tes données selon tes instructions : tu souhaites avoir le total contrôle de ce côté-ci, ce qu'Android ne te donne pas facilement.

Au vu de ton code, il faut que tu te renseignes sur l'utilisation des cellules dans ce genre de conteneur car tu auras d'autres soucis (comme une donnée non cochée, mais visuellement cochée à cause de la réutilisation de la cellule).
Ton tableau checkBoxTab est inutile. Cette information, coché ou non, doit être portée par ta classe "StationCapteurs" (à priori). Dans ta méthode getView, tu dois ensuite simplement modifier l'état de ta checkbox en fonction de la donnée "cochée" qu'il y aura dans ces classes.
Le Listener doit être mis séparément sur chacune des checkbox (ou réutilisé en le rendant générique... vu qu'il semble faire un truc générique).

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment