OnCreate之后调用OnItemSelectedListener的顺序

时间:2012-07-20 01:49:55

标签: android

我在Activity中有两个微调器,其中第二个微调器的选择集基于用户为第一个微调器选择的内容。我在Activity中使用了一个私有类变量,它在顶级Spinner的OnItemSelectedListener中设置,然后在底部Spinner的OnItemSelectedListener中引用,以获得正确的选择集。

这几乎总是有效,但有时候(主要是当app运行,没有退出,然后由用户再次点击很久以后再次启动)我在第二个Spinner的OnItemSelectedListener中得到一个空指针异常,因为这个局部变量没有被设定。这告诉我在OnCreate之后第二个Spinner的OnItemSelectedListener在第一个Spinner之前被调用。

是否有任何方法可以强制触发侦听器中的某个顺序,或者是否有更好的设计方法来处理第二个Spinner对第一个Spinner的依赖?

示例代码:     package com.crashtestdummylimited.navydecoder;

public class Test extends Activity {    

  // Variable that at times is still null
  private ReferenceData     referenceData;    

  private void setupSpinnerFromArray (int spinnerId, String stringArray[], OnItemSelectedListener listener) {    
    Spinner spinner = (Spinner) findViewById(spinnerId);    

    ArrayAdapter <CharSequence> adapter = new ArrayAdapter <CharSequence>(    
      this, android.R.layout.simple_spinner_item, stringArray);    

    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);    

    spinner.setAdapter(adapter);    

    spinner.setOnItemSelectedListener(listener);    
  }    

  @Override    
  public void onCreate(Bundle savedInstanceState) {    
    super.onCreate(savedInstanceState);    

    setContentView(R.layout.main_screen);    

    // Setup Top (main) Spinner    
    Spinner spinner1 = (Spinner) findViewById(R.id.mainDecodeSpinner);    

    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(    
      this, R.array.level0_list_array, android.R.layout.simple_spinner_item);    

    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);    
    spinner1.setAdapter(adapter1);    

    spinner1.setOnItemSelectedListener(new MainDecoderItemSelectedListener());    


    // Setup Bottom (dependent) Spinner    
    setupSpinnerFromArray(R.id.secondaryDecodeSpinner, R.array.level1_list_array, new SecondaryDecoderItemSelectedListener());    
   }    



  public class MainDecoderItemSelectedListener implements OnItemSelectedListener {    

    public void onItemSelected(AdapterView<?> parent,    
                                View view, int pos, long id) {    



      String selectedString = parent.getItemAtPosition(pos).toString();    

      if (selectedString.equals("AAA")){    
        // Problem variable is set
        referenceData = new RatingCodes();    
        setupSpinnerFromArray(R.id.secondaryDecodeSpinner, referenceData.getKeys(), new SecondaryDecoderItemSelectedListener());    
      }          
      else if (selectedString.equals("BBB")){    
        // Problem variable is set
        referenceData = new IMSCodes();      
        setupSpinnerFromArray(R.id.secondaryDecodeSpinner, referenceData.getKeys(), new SecondaryDecoderItemSelectedListener());    
      }    
      //  TODO: Improve what occurs if no match which should not occur    
    }    

    public void onNothingSelected(AdapterView<?> parent) {    
      // Do nothing.    
    }    
  }    


  public class SecondaryDecoderItemSelectedListener implements OnItemSelectedListener {    

    public void onItemSelected(AdapterView<?> parent,    
                                View view, int pos, long id) {    

      String key = parent.getItemAtPosition(pos).toString();    

      // **** referenceData being null at this point has caused crashed ****    
      String value = referenceData.getValue(key);    

      // ...  Update text on activity screen  ...    
    }    

    public void onNothingSelected(AdapterView<?> parent) {    
      // Do nothing.    
    }    
  }    

}    

1 个答案:

答案 0 :(得分:0)

public void onItemSelected(AdapterView<?> parent,View view, int pos, long id) 
{

 if(pos == 0) 
 { //when it loads on onCreate() then pos is always 0
        //donothing              
  } 
 else 
 { //If user manually select item

           //do what you need to do on manual user selection

 }
}