J'ai deux spiners, le premier spinner est un tableau Integer et le second est un tableau de chaînes 2D.

ArrayAdapter adapter1,adapter3;
String selectedsection;
Integer selectedsem;
Integer[] semester= new Integer[] {1, 2, 3, 4, 5};
String[][] subject=new String[][]{{"m1"},{"m2"},{"m3"},{"m4"},{"m5"},{"m6"},{"m7"},{"m8"}};
    adapter1 = new ArrayAdapter<Integer>(this, android.R.layout.simple_spinner_item, semester);
    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_item);
    sp1.setAdapter(adapter1);
    sp1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            selectedsem = (Integer)parent.getItemAtPosition(position);
            Toast.makeText(getApplicationContext(),String.valueOf(selectedsem),Toast.LENGTH_SHORT).show();
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {}
    });

adapter3 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, subject[selectedsem]);
    adapter3.setDropDownViewResource(android.R.layout.simple_spinner_item);
    sp3.setAdapter(adapter3);
    sp3.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            selectedsubject = parent.getItemAtPosition(position).toString();
            Toast.makeText(getApplicationContext(),String.valueOf(selectedsem),Toast.LENGTH_SHORT).show();
            Toast.makeText(getApplicationContext(), selectedsubject, Toast.LENGTH_SHORT).show();
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {}
    });

L'application plante car elle ne trouve pas la valeur de selectedsem. SO, comment obtenir la valeur de selectedsem à partir du premier spinner, utilisez-le dans le second spinner. J'espère que la question est comprise!

-1
PAWAN LAKHOTIA 23 mai 2018 à 19:56

3 réponses

Meilleure réponse

La raison en est que comme il s'agit d'un entier, il peut être nul et que vous essayez de l'utiliser lors de son initialisation et que rien n'est encore sélectionné, vous pouvez obtenir nullpointerexception, alors mieux vaut lui donner une valeur par défaut de 0 ou quelque chose à l'initialisation.

Puis créez simplement un adaptateur pour le deuxième spinner après que l'utilisateur sélectionne l'élément.

Vous pouvez placer votre deuxième création d'adaptateur juste sous onItemSelected

sp1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        selectedsem = semester[parent.getSelectedItemPosition()];
        //second adapter code goes here
       ArrayAdapter<String> adapterNew = new ArrayAdapter<String>(YourActivity.this, android.R.layout.simple_spinner_item, subject[selectedsem]);
       sp3.setAdapter(adapterNew);
        Toast.makeText(getApplicationContext(),String.valueOf(selectedsem),Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onNothingSelected(AdapterView<?> parent) {}
});

Nous mettons juste à jour le deuxième spinner juste après que l'utilisateur sélectionne une valeur dans (OnItemSelected) le premier spinner.

0
vikas kumar 23 mai 2018 à 18:52

Cela se produit parce que la méthode onItemSelected de votre premier spinner OnItemSelectedListener n'est appelée que lorsque le spinner est effectivement sélectionné par l'utilisateur . Ainsi, lorsque vous essayez d'instancier votre adapter3, selectedsem est toujours nul. Pour résoudre ce problème, vous devez placer tout le code là où vous vous attendez à ce que selectedsem ait une valeur, juste après qu'il obtient une valeur, c'est-à-dire: à l'intérieur de la méthode onItemSelected. Comme ça:

sp1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            selectedsem = (Integer)parent.getItemAtPosition(position);
            Toast.makeText(getApplicationContext(),String.valueOf(selectedsem),Toast.LENGTH_SHORT).show();
            if (selectedsem != null) {
                adapter3 = new ArrayAdapter<String>(YourActivity.this, android.R.layout.simple_spinner_item, subject[selectedsem]);     
                adapter3.setDropDownViewResource(android.R.layout.simple_spinner_item);

                sp3.setAdapter(adapter3);
                sp3.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                        selectedsubject = parent.getItemAtPosition(position).toString();
                        Toast.makeText(getApplicationContext(),String.valueOf(selectedsem),Toast.LENGTH_SHORT).show();
                        Toast.makeText(getApplicationContext(), selectedsubject, Toast.LENGTH_SHORT).show();
                    }
                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {}
                });
            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {}
    });
}
0
Cauê Jannini 23 mai 2018 à 20:18

Essayez de créer le deuxième adaptateur dans une autre fonction et appelez-le juste après la création du premier adaptateur, je veux dire essayez de planifier les deux tâches non asynchrones et non asynchrones

0
Bita Karimi 23 mai 2018 à 17:18