Android开发:如何根据首个Spinner选择联动更新第二个Spinner?
解决Spinner联动更新问题(无需JSON/数据库)
嘿,我看出来问题出在哪了——你的代码只在Activity启动的时候判断了一次gedungSpn的选中状态,但没有监听它的选择变化事件!所以当你切换第一个Spinner的选项时,第二个Spinner根本不会收到更新通知。
下面是修复后的完整代码,我还给你做了点优化,避免重复冗余的操作:
Spinner gedungSpn, lantaiSpn, ruangSpn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_kelas); // 提前初始化第二个Spinner,避免重复执行findViewById lantaiSpn = (Spinner) findViewById(R.id.lantai_spn); // 初始化第一个Spinner的选项 GedungSpinner(); // 核心:给第一个Spinner设置选择监听,实时触发第二个Spinner的更新 gedungSpn.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // 根据选中的位置切换第二个Spinner的数据源 if (position == 0){ LantaiSpinnerRektorat(); }else if(position == 1){ LantaiSpinnerGL(); } } @Override public void onNothingSelected(AdapterView<?> parent) { // 可选:没有选中项时的处理逻辑,这里留空即可 } }); // 初始化页面时,默认加载第一个选项对应的楼层数据 LantaiSpinnerRektorat(); } public void GedungSpinner(){ gedungSpn = (Spinner) findViewById(R.id.gedung_spn); List<String> list = new ArrayList<String>(); list.add("Rektorat"); list.add("Griya Legita"); ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, list); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); gedungSpn.setAdapter(dataAdapter); } public void LantaiSpinnerRektorat(){ List<String> list = new ArrayList<String>(); list.add("Lantai 1"); ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, list); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); lantaiSpn.setAdapter(dataAdapter); } public void LantaiSpinnerGL(){ List<String> list = new ArrayList<String>(); list.add("Lantai 1"); list.add("Lantai 2"); list.add("Lantai 3"); list.add("Lantai 4"); list.add("Lantai 5"); list.add("Lantai 6"); list.add("Lantai 7"); list.add("Lantai 8"); ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, list); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); lantaiSpn.setAdapter(dataAdapter); }
关键改动说明:
- 添加
OnItemSelectedListener:这是实现Spinner联动的核心,用户切换第一个Spinner选项时会自动触发onItemSelected方法,我们在这里完成第二个Spinner的内容更新 - 提前初始化
lantaiSpn:把它的控件查找逻辑移到onCreate中,避免每次调用楼层方法都重复执行findViewById - 初始化默认数据:确保页面启动时,第二个Spinner能显示第一个选项对应的楼层内容
如果想进一步简化代码,还可以把楼层数据提前存在一个Map集合里(比如Map<Integer, List<String>> floorDataMap),这样不用写两个单独的方法,直接根据选中位置从Map中取数据创建适配器即可,不过当前的写法已经完全能满足你的需求啦。
内容的提问来源于stack exchange,提问作者Qube
相关产品推荐
相关产品推荐

