0

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

这几乎总是有效的,但有时(主要是当应用程序运行时,未退出,然后通过用户点击一段时间后再次启动)由于未设置此局部变量,我在第二个 Spinner 的 OnItemSelectedListener 中得到一个空指针异常。这向我表明,在 OnCreate 之后,第二个 Spinner 的 OnItemSelectedListener 在第一个 Spinner 之前被调用。

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

示例代码:包 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.    
    }    
  }    

}    
4

1 回答 1

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

 }
}
于 2012-09-20T17:10:41.157 回答