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
相关产品推荐
相关产品推荐

