如何有效地匹配结果字符串与各种选项?

时间:2010-07-06 12:24:32

标签: java android

如果您有列表活动并且在onListItemClick()中,您需要获取所选项目,然后将其与各种选项进行匹配,这样做的有效方法是什么?因为我想匹配字符串,所以无法使用switch case。是一个很长的if-else if ladder是唯一的方法吗?

基本上问题是如何做一些通常在使用字符串的switch语句中完成的事情。

3 个答案:

答案 0 :(得分:2)

在Android中,建议使用adaptercursor,您将使用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();
    }
}