我有一个微调器,我正在使用 Room 存储库填充对象列表。微调器当前正确显示对象的名称值,但我在后端需要的是能够根据所选项目的键值设置默认值,并保存所选的新键值。 即第一个对象的键值可能为 1,名称值为“蜜月”,第二个对象可能为 2 和“实地考察”,用户将在实地考察和蜜月之间进行选择,但我想以编程方式与之交互的所有内容只是 1 或 2。
这是填充微调器的代码:
public void popVacations(){
Spinner spinner = findViewById(R.id.associatedVacationSpinner);
repository = new Repository(getApplication());
List<Vacation> allVacations = repository.getmAllVacations();
ArrayAdapter<Vacation> spinnerAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, allVacations);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(spinnerAdapter);
spinnerAdapter.notifyDataSetChanged();
}
让我知道我是否需要使用存储库或 DAO 中的相关代码进行更新,我只是认为如果整个应用程序(除了这个微调器之外)的所有内容都按预期工作,那么这一点并不重要。
Spinner(与 ListView 非常相似)由适配器驱动(在您的例子中是 ArrayAdapter)。
它是处理数据(在您的例子中的对象数组)并将其放置到每个显示的项目的相应视图中的适配器。视图由各自的布局决定。
对于标准 ArrayAdpater,它使用对象(每个项目)的
toString
方法作为显示的值。当您覆盖 toString
方法时,这就是显示的内容。如果您不重写对象的 toString
方法,则使用默认(封装的)toString
来填充显示;请注意,默认值很可能基本上是包含指针值的值的转储@xxxxxxxx...
。
至于项目/对象与源数组的相关性,使用的是源数组/列表中的POSITION(因此也是显示列表中的位置),这是距开始的偏移量。即列表中的第一项位于位置 0。
您绝对不应该将该位置等同于您所称的自动生成的值(从现在开始称为 ID,因为该值唯一地id标识表中的相应行),因为这样的值可能(可能至少在开始时)从1 并且可能单调增加,但不能保证一定会出现这种情况。此外,如果提取的数据的顺序是根据 ID 的,则只会按升序排列,在没有
ORDER BY
子句的情况下可能是这种情况,但也可能不是。
例如其中 Honeymoney 的 ID 为 1 = 位置 0,Field Trip 的 ID 为 2 = 位置 2。如果按名称排序,则 Field Trip 将是位置 0,HoneyMoon 位置 1 ....
同样,尝试调整位置通常会不正确,也许一开始不是,但后来如果可以删除行或提取的数据进行排序。
要检索有关所选项目的数据,尤其是 ID,您可以使用
getSelectedItem
方法获取所选项目,或使用位置从数组中获取项目。然后,项目/对象(即底层数组中的对象)将具有各自的值。
要将某个项目设置为选定项(默认),您可以使用
setSelection
设置相应的位置(同样不是 ID)。最安全的方法是搜索源数组来定位实际位置。
如果您想要其他类型的行为,比如说有一个带有下拉列表的交替彩色背景的微调器,或者说每个项目有多个视图等等,那么您将/可能需要一个自定义适配器(也许/可能继承自ArrayAdapter)以及可能的自定义布局。