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

  1. #1
    Membre à l'essai
    Modification d'un ArrayAdapter pour un spinner
    Bonjour, après avoir effacer ce message 3 ou 4 fois parce que je pensais avoir trouvé la solution, je me décide à demander de l'aide. Je souhaite que les items du menu déroulant d'un spinner(n°2) dépendent de l'item sélectionné dans un précédent spinner(n°1). Débutant en Kotlin et n'étant pas passé par JAVA, je galère un peu...

    Mes deux spinners fonctionnent très bien, mis à part ce problème là.

    Dans le onItemSelected du spinner n°1, j'ai mis un when (qui fonctionne puisque j'ai testé les différentes valeurs avec un toast) qui, en fonction de l'itm du spinner n°1, détermine les valeurs que doit prendre la variable "arraySpinner2 : Array<String>" qui vient en paramètre de l'ArrayAdapter de mon spinner n°2 (aa = ArrayAdapter(this, android.R.layout.simple_spinner_item, arraySpinner2).


    Au départ, plantage, la variable n'était pas déclarée (plantage seulement pour la partie du when, alors que pour l'ArrayAdapter du spinner n°2 c'était bon).
    Corrigé en la déclarant en lateinit var au début de ma classe.

    Mais maintenant plantage parce que la variable lateinit n'est pas initialisée.
    Détourné en donnant une valeur de base à ma variable, mais du coup, c'est cette valeur qui reste tout le temps, quelque soit la séléction du spinner n°1 (et donc l'orientation de mon when).

    Je pensais avoir résolu mon problème en ajoutant à la suite du when un "adapter(du spinner n°2).notifyDataSetChanged", mais non...

    Je sèche! Je ne sais pas si j'ai été clair...

    Comme ce n'est peut-être pas très clair, je met le code ci dessous (dans le code, j'ai retiré la valeur par défaut de mon spinner n°2 (donc lateinit var non initialisée).

    Merci d'avance pour votre aide

    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
    package com.example.prv
     
    import Utils.showToast
    import android.content.Context
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.view.View
    import android.widget.AdapterView
    import android.widget.ArrayAdapter
    import android.widget.Spinner
    import android.widget.Toast
    import androidx.appcompat.widget.Toolbar
     
    class CreateEtudeActivity : AppCompatActivity() {
     
        lateinit var arrayType1 : Array<String>
        lateinit var arrayType2 : Array<String>
        lateinit var arrayType2Adapter : ArrayAdapter<String>
     
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
     
            setContentView(R.layout.create_etude_layout)
     
    //Mise en place du spinnerType1
            arrayType1 = arrayOf("Batimentaire", "Manifestation", "DECI")
            val spinnerType1: Spinner? = FindViewById<Spinner>(R.id.spinner_type1_create_etude_layout) 
            val arrayType1Adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, arrayType1) 
     
    arrayType1Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) 
     
            spinnerType1?.adapter = arrayType1Adapter 
     
            spinnerType1?.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
     
                override fun onItemSelected(parent: AdapterView<*>?,view: View?,position: Int,id: Long) {
                    var type1 : String = spinnerType1?.selectedItem.toString()
     
                    when (spinnerType1?.selectedItem) {
                        "Batimentaire" -> arrayType2 = arrayOf("Résidence", "ICPE", "ERP")
                        "Manifestation" -> arrayType2 = arrayOf("Manif 1", "Manif 2", "Manif 3")
                        "DECI" -> arrayType2 = arrayOf("DECI 1", "DECI 2", "DECI 3")
                    }
                    arrayType2Adapter.notifyDataSetChanged()
                }
     
                override fun onNothingSelected(parent: AdapterView<*>?) {
                    showToast(context = this@CreateEtudeActivity, message = "Aucune séléction")
                }
            }
     
    //Mise en place du spinnerType2
            val spinnerType2: Spinner? = findViewById<Spinner>(R.id.spinner_type2_create_etude_layout) 
            arrayType2Adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, arrayType2) arrayType2Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)        spinnerType2?.adapter = arrayType2Adapter 
     
     
            spinnerType2?.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
     
                override fun onItemSelected(parent: AdapterView<*>?,view: View?,position: Int,id: Long) {
                    Toast.makeText(this@CreateEtudeActivity, spinnerType2?.selectedItem.toString() + " a été sélectionné", Toast.LENGTH_SHORT).show()
                }
     
                override fun onNothingSelected(parent: AdapterView<*>?) {
                    showToast(context = this@CreateEtudeActivity, message = "Aucune séléction")
                }
            }
     
    // Mise en place de la toolbar
            val toolbarCreateEtudeActivity = findViewById<Toolbar>(R.id.toolbar_create_etude_activity)
             setSupportActionBar(toolbarCreateEtudeActivity)
             supportActionBar?.title = "Nouvelle étude"
        }
     
    }

  2. #2
    Membre à l'essai
    Puisque personne n'a réussi à trouver une solution, je l'ai prise ailleurs et la partage pour que ça puisse peut-être servir à quelqu'un...

    Remplacer les arrayOf qui alimentent les menus déroulants par des mutableList, et dans le when, au lieu de remplacer carrément les variables, vider les mutableList (.clear) et les charger avec les nouvelles valeurs (arrayType2 = mutableListOf("choix1", "choix2",...)

###raw>template_hook.ano_emploi###