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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:24:51