Android切换国家后State Spinner值未更新代码问题排查
问题分析与修复方案
你遇到的问题核心是2处逻辑错误:
- 存储州列表的全局
arrayList未在每次请求新国家的州数据前清空,切换国家后新的州数据是追加到老数据后而非替换,表面看起来就像没有更新 - Adapter初始化、Spinner绑定Adapter、数据刷新的逻辑写在了遍历州列表的for循环内部,会重复创建Adapter、重复绑定,既浪费性能也容易触发界面更新异常
首次选择国家时arrayList是空的,所以逻辑看起来正常,切换国家后旧数据残留、逻辑冲突就会出现不更新的问题。
修复后代码示例
public void onResponse(Call<StatesModel> call, Response<StatesModel> response) { if (response.isSuccessful()){ StatesModel model = response.body(); List<StatesModel.StatesModelDetail> list = model.getData(); // 新增:先清空旧的州列表数据 arrayList.clear(); // 循环仅用来组装州数据,不执行Adapter相关操作 for (int i = 0; i < list.size(); i++){ stateData = list.get(i); String stateName = stateData.getName(); String code = stateData.getId(); String finalname = code + "-" + stateName; arrayList.add(finalname); } // Adapter相关逻辑移到循环外部,仅执行一次 ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), R.layout.simple_spinner_dropdown, arrayList); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); state.setAdapter(adapter); } }
可选优化
可以把ArrayAdapter设为全局变量,不需要每次请求都重新创建:
- 在类中声明全局变量
private ArrayAdapter<String> stateAdapter; - 页面初始化时就创建Adapter绑定到State Spinner
- 后续每次请求完新数据,清空
arrayList并添加新数据后,直接调用stateAdapter.notifyDataSetChanged()即可,不需要重复执行setAdapter,性能更高。
内容的提问来源于stack exchange,提问作者Amit Sharma
相关产品推荐
相关产品推荐

