You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:02:35