当方向发生变化时,如何首次在Spinner上禁用onItemSelected?

时间:2017-07-22 08:49:00

标签: android android-spinner

我有Activity Spinner。此Activity将根据Spinner选项从互联网上加载信息,并在此Activity中显示。第一次启动Activity时,默认情况下会选择Spinner。我使用Spinner#setOnItemSelectedListener,以便每次选择微调器时,都会触发从互联网加载信息的方法。

@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    String option = (String) parent.getItemAtPosition(pos);
    loadInfoFromInternet(option);
}

当手机方向改变时,Activity将被销毁并重新创建。我已将Spinner信息以及我从互联网上获取的信息存储在savedInstanceState的捆绑包中。有了它,我设法保存了Spinner的状态和来自互联网的信息。

问题在于我从互联网上获得的信息。方向更改时,将重新创建Spinner并选择一个选项。这将触发OnItemSelectedListener,它将调用onItemSelectedloadInfoFromInternet将再次触发。它使我存储在savedInstanceState中的数据被替换。

我想要的是当方向发生变化时,我希望Spinner不要触发loadInfoFromInternet,以便我可以显示之前状态的信息,而不是再次从互联网上加载。

最初,我想出了以下想法:

private boolean isNewState = false;

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

    if (savedInstanceState == null) {
        isNewState = true;
    }
}

@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    String option = (String) parent.getItemAtPosition(pos);

    if (isNewState) {
        loadInfoFromInternet(option);
    }
}

通过上述解决方案,当方向改变时,不再从因特网加载信息。这就是我想要的,但是,当我选择其他选项时,loadInfoFromInternet将不会被触发,因为它不是新状态(isNewState = false)。这不是我想要的。

1 个答案:

答案 0 :(得分:0)

您在问题中描述的内容听起来正常。在onCreate()方法中,您可以检查传入的Bundle参数。如果包 null,那么您可以假设您已保存状态对于您的微调器,您可以加载该状态。

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

    if (savedInstanceState == null) {
        isNewState = true;
    }
    else {
        int sIndex = savedInstanceState.getInt("S_INDEX");
        Spinner spinner = (Spinner) findViewById(R.id.yourSpinner);
        spinner.setSelection(S_INDEX);
    }
}

并向onSaveInstanceState()添加逻辑以保存微调器的索引状态:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    Spinner spinner = (Spinner) findViewById(R.id.yourSpinner);
    int sIndex = spinner.getSelectedItemPosition();
    savedInstanceState.putInt("S_INDEX", sIndex);
}

请注意,每次手机更改方向时都会调用onSaveInstanceState()。您需要做的就是将活动状态存储在Bundle中,以便在更改后保留活动状态。