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

Spinner无法选中项求助:Retrofit加载后点击无响应

解决Spinner显示选项但无法选中的问题

嘿,我看了你的代码,发现两个关键问题导致Spinner点了没反应,咱们一步步来修复:

问题1:数据源更新后,适配器没同步刷新

你在onCreate里就给Spinner设置了适配器,但那时候spinnerItem是空的。等Retrofit加载完数据调用displayCities往列表里加数据时,适配器根本不知道数据变了——虽然Spinner能显示出选项,但内部的数据状态没跟上,自然点不动。

问题2:适配器的上下文用错了

创建ArrayAdapter时你用了getApplicationContext(),这可能会导致视图绑定出问题,换成当前Activity的上下文(this)更稳妥。

修复后的代码调整

首先把适配器改成成员变量,方便后续刷新:

private List<String> spinnerItem;
private ArrayAdapter<String> spinnerAdapter; // 新增成员变量

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    spinnerItem = new ArrayList<>();
    setSpinner();
}

public void displayCities(List<CityResponse.City> cities) {
    mainBinding.helloText.setText(cities.get(508).getNama());
    spinnerItem.clear(); // 先清空旧数据,避免重复添加
    for (CityResponse.City city : cities) {
        Log.d(TAG, city.getNama());
        spinnerItem.add(city.getNama());
    }
    // 关键一步:通知适配器数据已经更新
    spinnerAdapter.notifyDataSetChanged();
}

private void setSpinner(){
    // 把getApplicationContext()换成当前Activity的this
    spinnerAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, spinnerItem);
    spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    mainBinding.spinnerCity.setAdapter(spinnerAdapter);
    
    mainBinding.spinnerCity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            String citySelected = parent.getItemAtPosition(position).toString();
            // 注意这里的上下文:你之前写的CityActivity.this,要改成当前Activity的类名(比如你的类是MainActivity就写MainActivity.this)
            Toast.makeText(MainActivity.this, "City : " + citySelected, Toast.LENGTH_LONG).show();
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            Toast.makeText(MainActivity.this, "Not Selected", Toast.LENGTH_LONG).show();
        }
    });
}

额外要注意的点

  • 确保displayCities是在主线程调用的:Retrofit的enqueue回调默认是主线程,但如果是用execute或者自定义了线程,记得用runOnUiThread包裹刷新适配器的代码:
    runOnUiThread(() -> spinnerAdapter.notifyDataSetChanged());
    
  • 检查布局:如果Spinner的父布局设置了android:clickable="true"或者拦截了点击事件,也会导致Spinner无法响应,得把父布局的点击拦截去掉。

这样改完之后,Spinner应该就能正常选中并弹出Toast了!

内容的提问来源于stack exchange,提问作者Afdal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:42:13