Android技术问题:如何将Spinner选中项的ID与名称分别填入两个不同的TextView
解决Spinner选中教师后同时显示姓名和ID的问题
嗨,刚从Windows Forms转Android确实会有点水土不服,Spinner和ComboBox的思路差异还挺明显的。你现在的核心问题是没把教师的ID和姓名绑定成一组数据,导致选中姓名后没法直接关联到对应的ID,还重复查数据库,既麻烦又低效。我来帮你调整下代码:
第一步:创建Teacher类封装数据
我们需要把每个教师的ID和姓名存成一个独立对象,这样就能把两个数据牢牢关联在一起,而不是分开丢进列表:
public class Teacher { private String id; private String name; public Teacher(String id, String name) { this.id = id; this.name = name; } public String getId() { return id; } public String getName() { return name; } // 重写toString,让Spinner显示教师姓名 @Override public String toString() { return name; } }
第二步:修改fillSpinner方法
现在我们把查询到的每个教师都封装成Teacher对象,存到列表里,这样Spinner的每个选项都是完整的教师信息,选中时直接就能拿到ID和姓名:
public void fillSpinner() { Connection conn = connection();//connection to sql server database try { if (conn != null) { testText.setText("Connected to server!"); String query = "SELECT id_Teacher, teacherName FROM Teachers"; PreparedStatement pst = conn.prepareStatement(query); ResultSet rs = pst.executeQuery(); // 存储Teacher对象的列表,替代原来的字符串列表 ArrayList<Teacher> teacherList = new ArrayList<>(); while (rs.next()) { String id = rs.getString("id_Teacher"); String name = rs.getString("teacherName"); teacherList.add(new Teacher(id, name)); } // 用Teacher列表创建适配器 ArrayAdapter<Teacher> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, teacherList); spinner.setAdapter(adapter); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // 获取选中的Teacher对象 Teacher selectedTeacher = (Teacher) parent.getSelectedItem(); // 直接设置姓名和ID到对应TextView testText.setText(selectedTeacher.getName()); txtId.setText(selectedTeacher.getId()); } @Override public void onNothingSelected(AdapterView<?> parent) { // 可选:设置默认提示 testText.setText("请选择教师"); txtId.setText(""); } }); } else { testText.setText("IP Address incorrect or \n not entered!"); } } catch (Exception e) { e.printStackTrace(); testText.setText("加载数据出错:" + e.getMessage()); } finally { // 记得关闭数据库连接,避免资源泄漏 try { if (conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } }
第三步:删除fillIdTextView方法
现在完全不需要这个方法了——选中Spinner时直接从Teacher对象里拿ID,不用再重复查询数据库,既简化了代码,又提升了性能。
为什么原来的代码行不通?
- 你之前把姓名和ID交替丢进同一个ArrayList,导致Spinner的选项是
["张三", "1", "李四", "2"...],选中时根本分不清当前项是姓名还是ID,更没法对应关联。 fillIdTextView里重复查数据库,还错误地把ID和选中姓名混进列表,最后把ArrayAdapter转成字符串设置到txtId,这完全不是正确的取ID方式,还浪费了数据库资源。
这样修改后,选中Spinner里的教师,姓名会显示在testText,对应的ID会显示在txtId,完美匹配你的需求!
内容的提问来源于stack exchange,提问作者Rowen
相关产品推荐
相关产品推荐

