【问题标题】:onItemSelected() with nested switch... how to avoid it?onItemSelected() 与嵌套开关...如何避免它?
【发布时间】:2012-07-25 11:30:47
【问题描述】:

对于我的 Android 项目,我准备了一个专用类来监听 onClick()、onTouch() 和 onItemSelected() 事件(它是 MVC 的控制器),并且屏幕上有几个 Spinner 对象。在这种情况下,当触发事件时,算法必须知道 1) 选择了哪个 Spinner 和 2) 选择了哪个 Item。因此,它会产生如下的嵌套开关。

@Override
public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
    switch(parent.getId()) {
    case R.id.spn1:
        switch (position) {
        case 0:
            // code
            break;
        case 1:
            // code
            break;
        case 2:
            // code
            break;
        }
    break;
    case R.id.spn2:
        switch (position) {
        case 0:
            // code
            break;
        case 1:
            // code
            break;
        case 2:
            // code
            break;
        }
    break;
    case R.id.spn3:
        switch (position) {
        case 0:
            // code
            break;
        case 1:
            // code
            break;
        case 2:
            // code
            break;
        }
    break;
    default:
    }
}

下面发布的示例已经让我很头疼。我肯定很想知道是否有一些方法(也许是使用 OOP)来避免这种大混乱。

【问题讨论】:

    标签: android spinner switch-statement


    【解决方案1】:

    这取决于您想对这些微调器位置做什么。如果您对每个微调器位置做完全不同的事情,那么您将无法进一步优化。

    在这种情况下,您可以做的最好的事情是为每个项目(或每个微调器,如果一个微调器在所有位置中执行类似的操作)创建并调用一个私有函数。

    不要认为嵌套开关不好,它们执行速度快,易于阅读和维护。您应该避免在每个 case 块中放置太多代码。您应该改为调用私有函数。

    【讨论】:

      【解决方案2】:

      我会为每个 View 创建一个单独的 Listener 类。

      public class MyClass extends Activity{
      
          @Override
          public void onCreate(Bundle savedInstanceState){
              super.onCreate(savedInstanceState);
      
              /* Necessary View fetching code omitted */
              mySpinner.setOnItemSelectedListener(new MySpinnerOnItemSelectedListener());
          }
      
          private class MySpinnerOnItemSelectedListener implements OnItemSelectedListener{
      
              @Override
              public void onItemSelected(AdapterView<?> parent, View v, int position, long id){ 
                  /* Here you only have your inner switch statement */
              }
          }
      }
      

      【讨论】:

      • OP已经提到了我准备了一个专门的类来监听onClick()、onTouch()和onItemSelected()事件
      • 我建议采用不同的方法。
      【解决方案3】:

      您可以为每个微调器使用单独的OnItemSelectedListener。

      如果您不希望这样,因为它们共享一些代码,我仍然会考虑在 onItemSelected 方法中使用一个开关来确定单击了哪个微调器,然后为每个微调器调用一个单独的方法,这会做你实际的项目切换。

      但只要它们不共享任何代码,我建议为每个微调器使用不同的侦听器。我还将这些侦听器创建为内部类,尽管它会使您的类有点膨胀。

      您也可以使用id 参数,只要您的适配器使用在所有微调器之间都不同的stable ids。最直截了当的是,情况并非如此,因此您仅限于上述两种可能性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-05
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-26
        相关资源
        最近更新 更多