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

