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

Android中如何通过Spinner从List获取多字段数据并修复选中异常

Spinner无法选中、拿不到关联字段修复方案

核心问题点

你当前的实现存在4个直接导致异常的问题:

  • 自定义的my_spinner_textview布局未使用系统要求的TextView id,ArrayAdapter无法正确绑定控件点击和选中状态
  • 布局中Spinner声明的id为spinner,业务代码里却调用了不存在的spinCategory控件实例,存在引用错误
  • 选中回调里多余调用adapter.notifyDataSetChanged(),会强制重绘适配器,打断选中状态的留存
  • 自定义Model类命名、字段getter命名不规范,存在适配兼容隐患

分步修复代码

1. 修正自定义Model类

遵循Java大驼峰命名规范,补全必要构造方法,统一getter命名:

public class MyModel {
    private String id;
    private String title;
    private String tableid;

    // 补全全参构造方法,方便初始化数据
    public MyModel(String id, String title, String tableid) {
        this.id = id;
        this.title = title;
        this.tableid = tableid;
    }

    public String getId() {
        return id;
    }

    public String getTitle() {
        return title;
    }

    public String getTableid() {
        return tableid;
    }

    // ArrayAdapter默认会取toString()结果作为下拉展示文本,保留即可
    @NonNull
    @Override
    public String toString() {
        return title;
    }
}

2. 修正自定义Spinner收起项布局

R.layout.my_spinner_textview里的文本控件必须使用系统预置id@android:id/text1,参考实现:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="35dp"
    android:gravity="center_vertical"
    android:paddingStart="8dp"
    android:paddingEnd="8dp"
    android:textSize="14sp"/>

注意:布局内TextView的id必须写为@android:id/text1,这个id是ArrayAdapter固定查找的文本控件id,自定义修改会直接导致适配失效。

3. 修正业务绑定代码

修正控件id引用,移除多余的重绘调用,初始化测试数据验证逻辑:

// 先通过findViewById拿到正确的Spinner实例,和XML里声明的id对应
Spinner spinner = findViewById(R.id.spinner);
ArrayList<MyModel> dropList = new ArrayList<>();
// 初始化测试数据
dropList.add(new MyModel("1", "test 1", "my_value"));
dropList.add(new MyModel("2", "test 2", "my_value2"));

ArrayAdapter<MyModel> adapter = new ArrayAdapter<>(this, R.layout.my_spinner_textview, dropList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        // 直接通过position取对应位置的模型数据即可
        MyModel selectedItem = dropList.get(position);
        String tableId = selectedItem.getTableid();
        String title = selectedItem.getTitle();
        // 以下是测试逻辑,可替换为自己的业务处理
        Toast.makeText(ShayariEditor.this, "选中title:"+title+",对应tableid:"+tableId, Toast.LENGTH_SHORT).show();
        // 禁止在这里调用adapter.notifyDataSetChanged(),会重置选中状态
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
    }
});

效果说明

修复后下拉列表会正常展示每个条目的title字段,点击选项后可正常触发选中回调,直接从对应位置的MyModel实例中就能拿到关联的tableid、id等所有自定义字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:33:11