从微调器中检索整数值

retrieving integer value from spinner

我有两个微调器,第一个微调器是一个整数数组,第二个是一个二维字符串数组。

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) {}
    });

应用程序崩溃,因为找不到 selectedsem 的值。那么,如何从第一个微调器中获取 selectedsem 的值,在第二个微调器中使用它。 希望问题得到理解!

尝试在另一个函数中创建第二个适配器并在第一个适配器创建后立即调用它,我的意思是尝试安排两个任务不是异步的不是异步的

原因是因为它是 Integer 它可以是 null 并且你在初始化它时尝试使用它但尚未选择任何东西你可能会得到 nullpointerexception 所以最好在初始化时给它一个默认值 0 或其他值

然后在用户选择项目后为第二个微调器创建适配器。

您可以将您的第二个适配器创建放在 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) {}
});

我们只是在用户在 (OnItemSelected) 第一个微调器中选择某个值后更新第二个微调器。

发生这种情况是因为第一个微调器 OnItemSelectedListener 的方法 onItemSelected 仅在微调器实际被用户选择时调用 。因此,当您尝试实例化 adapter3 时,selectedsem 仍然为空。要解决此问题,您必须将所有代码放在您期望 selectedsem 具有值的位置,紧接着它实际上 获取 一个值,即:在 [=11= 内部] 方法。像这样:

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) {}
    });
}