Android Spinner点击显示对象ID问题及用户保存类别选中方法咨询
问题解决指南
1. 修复Spinner下拉显示对象值的问题
你遇到的下拉列表显示类似com.yourpackage.CitiesModel@xxxxxx这种对象值的原因很明确:你只重写了getView()方法(负责Spinner收起时的默认显示样式),但没有重写getDropDownView()方法——ArrayAdapter默认的下拉视图会直接调用CitiesModel的toString()方法,所以才会显示这种对象内存地址格式的内容。
解决方法就是在你的CityAdapter里添加getDropDownView()的重写,逻辑和getView()一致即可:
public class CityAdapter extends ArrayAdapter<CitiesModel> { public CityAdapter(@NonNull Context context,@NonNull int textviewId,@NonNull List<CitiesModel> cities) { super(context,0,textviewId,cities); } @NonNull @Override public View getView(int position, @Nullable View convertView,@NonNull ViewGroup parent) { CitiesModel rowItem = getItem(position); View rowview = convertView; if(rowview == null) rowview = LayoutInflater.from(getContext()).inflate(R.layout.city_row,parent,false); TextView cityTitle = (TextView) rowview.findViewById(R.id.citytitle); cityTitle.setText(rowItem.getCityName()); return rowview; } // 新增该方法,处理下拉列表的每个项视图 @Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { // 直接复用getView的逻辑即可,若需要不同样式可单独加载其他布局 return getView(position, convertView, parent); } }
如果你的下拉列表需要和Spinner默认显示不一样的样式,也可以在getDropDownView()里单独加载另一个布局(比如R.layout.city_dropdown_row),逻辑和getView()类似。
2. 设置用户已保存的类别为选中状态
要实现这个功能,你需要分两步操作:
- 第一步:从存储介质(比如SharedPreferences、数据库)中获取用户之前保存的城市信息(可以是
CitiesModel对象、城市ID或者城市名称) - 第二步:在数据完全加载到Adapter之后(比如
onLoadFinished()方法内),遍历Adapter的数据,找到对应保存项的位置,调用spinner.setSelection(position)
举个实际例子,假设你保存了城市名称savedCityName:
@Override public void onLoadFinished(Loader<List<CitiesModel>> loader, List<CitiesModel> cites) { mAdapter.clear(); if(cites!=null && !cites.isEmpty()) { mAdapter.addAll(cites); // 在这里设置选中已保存的城市 String savedCityName = "上海"; // 替换成你实际获取的保存值 for(int i=0; i<cites.size(); i++){ // 建议用城市ID匹配,避免名称重复的情况 if(cites.get(i).getCityName().equals(savedCityName)){ spinner.setSelection(i); break; } } } }
注意:必须等到数据完全加载到Adapter之后再调用setSelection(),否则会因为Adapter为空或者找不到对应项而无效。
内容的提问来源于stack exchange,提问作者zeeshan haider
相关产品推荐
相关产品推荐

