Java 安卓-正在使用';instanceof';确定“中的微调器返回的项目类型的唯一方法”;“是否选中?”;?
如标题所示— 是否有任何方法可以确定从Java 安卓-正在使用';instanceof';确定“中的微调器返回的项目类型的唯一方法”;“是否选中?”;?,java,android,listener,spinner,instanceof,Java,Android,Listener,Spinner,Instanceof,如标题所示— 是否有任何方法可以确定从中的微调器获得的项目类型(通常是字符串,如果是从资源改编的,或者是通用对象,如果是通过编程改编的,则是从中选择的?在本例中,我指的是在Java中以编程方式填充的,但据我所知,对于从字符串资源数组创建的一个也是一样的 然而,显然,我们创建了旋转器,我们知道其中的一切是什么类型的。如果它来自资源,可能是字符串。如果以编程方式完成,则会出现某种类型的对象或可能的视图。但是,onItemSelected的签名如下所示: @Override public void o
中的微调器获得的项目类型(通常是字符串,如果是从资源改编的,或者是通用对象,如果是通过编程改编的,则是从中选择的
?在本例中,我指的是在Java中以编程方式填充的,但据我所知,对于从字符串资源数组创建的一个也是一样的
然而,显然,我们创建了旋转器,我们知道其中的一切是什么类型的。如果它来自资源,可能是字符串。如果以编程方式完成,则会出现某种类型的对象
或可能的视图
。但是,onItemSelected
的签名如下所示:
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
// actions
// to get the item, you would usually do something like:
parent.getItemAtPosition(pos);
}
但我觉得这并不优雅。当然,至少在我给出的简单情况下(比如Integer
)是有效的。它甚至可以用于处理多个不同类型的微调器
,所有这些微调器都运行在同一个侦听器上
——我实际上还没有尝试过
但似乎应该有一种方法让签名简单地像:
public void onItemSelected(AdapterView<Integer> parent, View view, int pos, long id)
public void已选择(AdapterView父视图、视图视图、整数位置、长id)
使用“instanceof”是确定“onItemSelected”中微调器返回的项目类型的唯一方法吗
这不是唯一的办法。但这可能是最好的办法
以下是一些备选方案:
if (itemSelected.getClass().getName().equals("java.lang.Integer")) {
doSomeMath((Integer) itemSelected);
}
if (itemSelected.getClass() == Integer.class) {
doSomeMath((Integer) itemSelected);
}
try {
doSomeMath((Integer) itemSelected);
} catch (ClassCastException ex) {
// squash
}
注:
这些替代方案都不推荐。真的
instanceof
操作符也测试子类,与前两个选项不同
如果在doSomeMath
方法中抛出ClassCastException
,则第三个版本也将挤压它
null出现问题
。instanceof
运算符为null
返回false,但所有这些选项都将抛出NPE
不幸的是,你的替代方案行不通。AdapterView.OnItemSelectedListener接口声明该方法的第一个参数具有该类型。该接口不是通用的
但似乎应该有办法得到签名[…]
这似乎是因为AdapterView.getItemAtPosition(int)
返回Object
,所以无法执行<代码>列表视图
或微调器
不知道或不关心适配器包含的项目类型
显然,但是,我们创建了微调器,我们知道其中的所有内容都是什么类型的
确切地说,由于您是将哪些数据放入适配器的最终主人,因此您应该能够安全地强制转换这些数据
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
final int item = (int) parent.getItemAtPosition(pos);
doSomeMath(item);
}
@覆盖
已选择公共位置(AdapterView父项、视图、整数位置、长id){
final int item=(int)parent.getItemAtPosition(pos);
doSomeMath(项目);
}
它不会检查“始终为真”的条件,而是在遇到意外数据时崩溃
进入这种心态:如果发生了不应该发生的事情,代码应该抛出异常。这使您有机会修复任何错误,而不是永远不知道是否有任何错误
另一种选择是将适配器存储在成员变量中,并从侦听器访问它
private MyAdapter adapter;
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
final int item = adapter.getItem(pos);
doSomeMath(item);
}
private-MyAdapter;
@凌驾
已选择公共位置(AdapterView父项、视图、整数位置、长id){
最终int项=适配器.getItem(pos);
doSomeMath(项目);
}
这假设您的适配器覆盖getItem(int)
并返回适当的类型。这里的目标是什么?是否要对多个微调器使用相同的OnItemSelectedListener
?不,不一定。只是想知道是否有比instanceof
更好的方法来确定从微调器检索到的对象的类型。我认为没有。无论如何,我宁愿检查哪个微调器(parent.getId()
)触发了onItemSelected
调用,然后相应地执行操作,而不是根据项目的类型执行操作。如果由同一个侦听器处理多个微调器,那么这似乎是最好的方法。之后我也考虑过了。但无论如何,您通常需要知道类型才能对其执行操作,即使您确实知道它来自的确切微调器。是否可以扩展OnItemSelectedListener
接口以创建具有特定类型的自定义版本的onItemSelected
?或者甚至将其扩展为通用版本?例如:GenericItemSelectedListener扩展了AdapterView.OnItemSelectedListener
,并选择了public void onItemSelected(AdapterView父项…
?如果其他参数类型也不同,则选择“是”。否则不会。但不清楚你会取得什么成就。您如何让android框架调用该方法?
private MyAdapter adapter;
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
final int item = adapter.getItem(pos);
doSomeMath(item);
}