Android Spinner选中项不显示问题求助(Java)
解决Spinner选中后不显示内容的问题
我帮你梳理几个大概率导致这个问题的原因,以及对应的修复方案:
1. 错误的Spinner选中项布局
你当前用android.R.layout.simple_selectable_list_item作为Spinner的默认显示布局,这个布局是给列表选择控件用的,并不适配Spinner的选中项展示逻辑。Spinner的默认选中项布局应该用android.R.layout.simple_spinner_item,它包含了正确的TextView控件来展示选中后的内容。
2. 未重写Service类的toString()方法
ArrayAdapter默认会调用数据对象的toString()方法来获取要显示的文本。如果你的Service类没重写这个方法,Spinner显示的会是对象的内存地址(看起来像空白或乱码),而不是你期望的业务内容。
3. 异步加载数据后未通知Adapter刷新
你在doInBackground里填充数据,但没有在数据加载完成后通知Adapter更新。必须在AsyncTask的onPostExecute方法里调用notifyDataSetChanged(),这样Adapter才会感知到数据变化并刷新UI。
4. 上下文使用不当
用getApplicationContext()可能会引发布局样式或主题适配问题,建议直接用Activity的上下文(this)来创建Adapter。
修改后的完整代码示例
首先,重写Service类的toString()方法:
public class Service { private String name; // 你的getter和setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } // 重写toString,返回Spinner要显示的文本 @Override public String toString() { return name; } }
然后调整Spinner初始化和AsyncTask的代码:
ArrayList<Service> list = new ArrayList<>(); private ArrayAdapter<Service> servicesAdapter; // 把Adapter设为成员变量,方便异步更新 public void setUpSpinner(){ Spinner services = findViewById(R.id.servicesSpinner); // 使用Activity上下文+正确的选中项布局 servicesAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list); servicesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); services.setAdapter(servicesAdapter); } // 你的AsyncTask部分 protected Void doInBackground(Void... params) { JSONObject jsonObject = JSONParser.getDataFromWeb(); try { if (jsonObject != null && jsonObject.length() > 0) { JSONArray array = jsonObject.getJSONArray(Keys.KEY_CONTACTS); int lenArray = array.length(); if (lenArray > 0) { for (; jIndex < lenArray; jIndex++) { Service model = new Service(); // 每次循环创建新对象,避免引用重复 String name = array.getJSONObject(jIndex).getString("你的name字段键"); // 补充获取name的代码 model.setName(name); list.add(model); } } } } catch (JSONException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); // 数据加载完成后通知Adapter刷新 if(servicesAdapter != null){ servicesAdapter.notifyDataSetChanged(); } }
另外注意:你之前的代码里model的创建被注释了,要确保每次循环都实例化新的Service对象,否则所有条目会引用同一个对象,导致数据展示异常。
内容的提问来源于stack exchange,提问作者helloWorld
相关产品推荐
相关产品推荐

