Android开发如何高效获取Spinner选中元素 减少冗余编码
安卓Spinner批量获取选中值高效实现方案
你不需要为每个Spinner单独设置选择监听,两种高效实现方案如下:
方案1:提交时批量读取(最推荐,无额外监听开销)
你只需要在触发addResult提交方法的时候统一读取所有Spinner的选中值即可,代码改动最小:
- 首先在类中声明两个数组,统一管理Spinner和对应分数输入框:
public class Addresult extends AppCompatActivity { String subject[] = {"English", "Urdu", "Math", "Biology", "Chemistry", "Physics", "Computer"}; // 新增两个数组存储所有Spinner和对应分数输入框 Spinner[] spinners = new Spinner[7]; EditText[] scoreEdits = new EditText[7]; EditText eng, urdu, math, bio, chem, phy, comp, r; Database database; // 其余原有代码不变
- 在
onCreate中给数组赋值:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_addresult); database = new Database(this); // 原有findViewById逻辑不变 sp1 = findViewById(R.id.spinner1); sp2 = findViewById(R.id.spinner2); sp3 = findViewById(R.id.spinner3); sp4 = findViewById(R.id.spinner4); sp5 = findViewById(R.id.spinner5); sp6 = findViewById(R.id.spinner6); sp7 = findViewById(R.id.spinner7); eng = findViewById(R.id.edsub1); urdu = findViewById(R.id.edsub2); math = findViewById(R.id.edsub3); bio = findViewById(R.id.edsub4); phy = findViewById(R.id.edsub5); comp = findViewById(R.id.edsub6); chem = findViewById(R.id.edsub7); r = findViewById(R.id.edroll); // 给数组赋值,顺序一一对应 spinners[0] = sp1; spinners[1] = sp2; spinners[2] = sp3; spinners[3] = sp4; spinners[4] = sp5; spinners[5] = sp6; spinners[6] = sp7; scoreEdits[0] = eng; scoreEdits[1] = urdu; scoreEdits[2] = math; scoreEdits[3] = bio; scoreEdits[4] = chem; scoreEdits[5] = phy; scoreEdits[6] = comp; // 原有适配器设置逻辑不变,注意删掉重复的sp1.setAdapter(ad) ArrayAdapter ad = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, subject); for(Spinner sp : spinners) { sp.setAdapter(ad); } }
- 在
addResult方法中直接遍历读取值:
public void addResult(View v) { String rol = r.getText().toString(); if (rol.isEmpty()) { Toast.makeText(this, "请先填写学号", Toast.LENGTH_SHORT).show(); return; } int roll = Integer.parseInt(rol); String[] selectedSubjects = new String[7]; String[] scores = new String[7]; boolean hasEmpty = false; for (int i = 0; i < 7; i++) { // 获取Spinner选中的科目 selectedSubjects[i] = spinners[i].getSelectedItem().toString(); // 获取对应分数 scores[i] = scoreEdits[i].getText().toString(); if (scores[i].isEmpty()) { hasEmpty = true; break; } } if (hasEmpty) { Toast.makeText(this, "请先填写所有字段", Toast.LENGTH_SHORT).show(); return; } // 按你数据库表的科目序列要求存入即可,selectedSubjects数组顺序和你表的subject1到subject7完全对应 resultmodel result = new resultmodel(scores[0], scores[1], scores[2], scores[3], scores[4], scores[5], scores[6], roll); int i = database.insertions(result); }
方案2:复用监听实例(仅适用于需要实时响应选择操作的场景)
如果需要用户选择Spinner后立刻做校验、联动等操作,可让Activity直接实现监听接口,所有Spinner复用同一个回调:
- 修改类定义实现接口:
public class Addresult extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
- 在
onCreate中给所有Spinner设置同一个监听:
for(Spinner sp : spinners) { sp.setOnItemSelectedListener(this); }
- 实现回调方法,通过控件id区分触发的Spinner:
@Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String selected = parent.getSelectedItem().toString(); switch (parent.getId()) { case R.id.spinner1: // 处理sp1选择逻辑 break; case R.id.spinner2: // 处理sp2选择逻辑 break; // 其余Spinner按需添加case即可 } } @Override public void onNothingSelected(AdapterView<?> parent) { }
代码优化提示
你原有代码存在两处可修正的问题:
- 重复调用了
sp1.setAdapter(ad),可以直接删除 resultmodel构造参数中的hemistry拼写错误,缺少首字母C,应为Chemistry
对应界面参考:
内容的提问来源于stack exchange,提问作者Mubashar Ali
相关产品推荐
相关产品推荐

