调用API后Spinner未显示列表,代码存在什么问题?
问题分析与修复方案
你的代码存在几个关键问题,导致Spinner无法正常显示列表:
循环内重复创建并设置适配器
你在for循环的每一次迭代中都新建ArrayAdapter并调用spin_class.setAdapter(adapter),这会让Spinner不断被重置适配器,最终仅保留最后一次循环的状态,且此时数组sub还未完成全部数据填充,无法加载完整的列表内容。重复设置选择监听器
在循环内反复给Spinner绑定OnItemSelectedListener完全冗余,监听器只需要设置一次即可,重复设置会覆盖之前的逻辑。字符串格式可能不符合预期
如果responseSubject.get(i).getData()本身就是单个字符串,使用Arrays.toString()会把它转换成[字符串内容]的带方括号格式,这不是Spinner需要的正常显示文本,应该直接取值。
修复后的代码
Call<List<ResponseSubject>> subjectOption = ApiClient.getInstance().getApi().subjectOption(); subjectOption.enqueue(new Callback<List<ResponseSubject>>() { @Override public void onResponse(Call<List<ResponseSubject>> call, Response<List<ResponseSubject>> response) { List<ResponseSubject> responseSubject = response.body(); if (responseSubject != null && responseSubject.size() > 0) { String[] sub = new String[responseSubject.size()]; // 循环仅负责填充数据数组 for (int i = 0; i < responseSubject.size(); i++) { // 直接取字符串内容,若getData返回数组再考虑用Arrays.toString sub[i] = responseSubject.get(i).getData(); } // 循环结束后统一创建并设置适配器 ArrayAdapter<String> adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, sub); spin_class.setAdapter(adapter); // 仅设置一次选择监听器 spin_class.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { // 在这里处理选中事件 } @Override public void onNothingSelected(AdapterView<?> adapterView) { // 处理未选中事件 } }); } } @Override public void onFailure(Call<List<ResponseSubject>> call, Throwable t) { // 可添加请求失败的处理,比如Toast提示 } });
额外注意事项
- 确认
spin_class已经通过findViewById正确绑定布局中的Spinner控件,这是容易忽略的隐性错误。 - 如果
getData()返回的是复杂对象,需要提取其中用于显示的字段再赋值给字符串数组。
内容的提问来源于stack exchange,提问作者Anusha C
相关产品推荐
相关产品推荐

