如果您有列表活动并且在onListItemClick()中,您需要获取所选项目,然后将其与各种选项进行匹配,这样做的有效方法是什么?因为我想匹配字符串,所以无法使用switch case。是一个很长的if-else if ladder是唯一的方法吗?
基本上问题是如何做一些通常在使用字符串的switch语句中完成的事情。
答案 0 :(得分:2)
在Android中,建议使用adapter
或cursor
,您将使用position
参数将适配器或光标跳转到给定位置。
您的适配器可以像数组,数据库游标或自定义适配器一样简单。
答案 1 :(得分:1)
你仍然可以使用带枚举的开关 - 你只需要将一个String输入转换为枚举 - 或者如果你没有枚举它就为null。像这样:
public enum Input {ONE, TWO, THREE, NULL}
并在代码中
String selection = getInput(); // some internal magic to get the selectes list item
Input input = Enum.valueOf(Input.class, selection.toUpperCase().trim());
if (input == null) input = Input.NULL;
switch(input) {
case ONE: // "one" was selected
case TWO: // "two" was selected
case THREE: // "three" was selected
default: // unrecognized / unhandled input
}
请注意,我跳过了break语句以保持示例简短。
刚刚了解到,在Android开发中应避免使用 if size and/or speed matters 枚举。因此,该模式也适用于旧式的静态consts,只需更改
Input input = Enum.valueOf(Input.class, selection.toUpperCase().trim());
到
int input = decode(selection.toUpperCase().trim());
并确保您拥有静态字段ONE,TWO,... set和解码器实现,以将String输入转换为您的常量之一。是的,它更加丑陋,特别是在解码器中,但是可以将它隐藏在看不见的地方。
答案 2 :(得分:1)
我通常会尝试创建像Andreas_D发布的枚举但如果这不起作用,您可以回退到键入您的字符串的Map,其值指向某种接口或基本类型。
使用“Command”模式大致看起来像这样的东西。
编辑:这里要求的是一个扩展的例子。此结构将为您提供与字符串键相关的switch语句的相同整体特征。当然,DoActionThing接口可以替换为基类。
public interface DoActionThing
{
public void doSomething();
}
public class Sample
{
private final String LIST_ITEM_1 = "Foo";
private final String LIST_ITEM_2 = "Bar";
private Map<String, DoActionThing> actions;
public Sample()
{
actions = new HashMap<String, DoActionThing>();
actions.put(LIST_ITEM_1, new DoActionThing()
{
@Override
public void doSomething()
{
handleFooSelection();
}
});
actions.put(LIST_ITEM_2, new DoActionThing()
{
@Override
public void doSomething()
{
handleBarSelection();
}
});
}
public void onListItemClick()
{
//Get the selected string from list
String selected = ....
DoActionThing dat = actions.get(selected);
dat.doSomething();
}
}