2 votes

Comment mettre en place le "setOnItemSelectedListener" sur plusieurs spinners créés dynamiquement ?

J'ai une activité où je dois créer un ou plusieurs spinners dynamiquement en fonction d'une base de données externe.

Certains de ces éléments doivent afficher un dialogue en fonction de la valeur du spinner. Par exemple, le spinner a les options suivantes : -Propriété -Location -Maison familiale Si l'utilisateur sélectionne Location, je dois afficher un dialogue (ou quoi que ce soit) lui demandant combien il paie par mois. S'il sélectionne "Maison individuelle" ou "Maison familiale", rien ne doit se passer.

Après avoir créé la mise en page avec les spinners, les edittexts, etc. J'utilise quelque chose comme ceci :

for(int q=0;q<=parent.getChildCount();q++){

        View v = parent.getChildAt(q);
        if (v instanceof Spinner) {
            Spinner res = (Spinner) v;
            res.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                    //Here its supposed to show dialog if the option is "RENT"
                }

                public void onNothingSelected(AdapterView<?> adapterView) {
                    return;
                }
            });
        }
    }

Le problème est que lorsque je fais cela, le "setOnItemSelectedListener" ne se déclenche que pour le dernier spinner de la disposition.

Comment puis-je faire ce que j'essaie ? Je ne sais pas quoi faire d'autre.

0voto

Silmarilos Points 453

La solution la plus simple serait probablement de créer un Listener comme variable et de l'utiliser pour tous vos spinners. Pour ce faire, vous ne devez pas le définir comme vous le faites actuellement (en utilisant le style anonyme de la classe interne), mais plutôt comme suit :

//This goes outside of the method
private AdapterView.OnItemSelectedListener listener = 
        new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        System.out.println("Spinner Selected ID = " + parent.getId());
        /*
        Put a check here for which one is being selected.
        While you could use the parent to check, in your case, it will be easier
        to use something from your DB table as a unique identifier (maybe a column
        name would be ideal? Your pick)
         */
        //Show your dialogs here
    }
    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        return;
    }
};

//This is the method you have where you are iterating the parent object
private void doStuff(){
    for(int q=0;q<=parent.getChildCount();q++){
        View v = parent.getChildAt(q);
        if (v instanceof Spinner) {
            Spinner res = (Spinner) v;
            res.setOnItemSelectedListener(listener);
        }
    }
}

Bonne chance à vous !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X