Spinner.setSelection不会正确触发OnItemSelectedListener

Jea*_*Roy 11 android spinner android-spinner

我正在为我的Android应用程序开发一个帐户管理活动,但是我很难弄清楚为什么来自微调器的setSelection()方法不会触发附加到所述Spinner的OnItemSelectedListener.

这就是我目前所拥有的;

onCreate()方法:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.account_management);

    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

    retreiveLanguage();
    initializeUI();

    // Vérification si l'usager est déjà connecté
    Globals appState = ((Globals) this.getApplication());
    boolean userLoggedIn = appState.isUserLoggedIn();
    boolean userInfoAvailable = appState.isUserInfoAvailable();

    if (userLoggedIn && userInfoAvailable) {
      fillUI();
    }
}   
Run Code Online (Sandbox Code Playgroud)

来自initializeUI()方法的相关行,该方法在Activity的创建中调用,该方法显示Spinner与Listener的绑定:

    /** OnItemSelectedHandler for the Country Spinner */
    mCountrySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        public void onItemSelected(AdapterView<?> parent, View view,
                int pos, long id) {
            Log.i(TAG, "onCountrySelected() was called, position : " + pos);

            mProvinces = new ArrayList<String>();
            mProvincesCode = new ArrayList<String>();

            mXML.parseResponse(FileManager.getInstance().getPortalOptions());

            for (int i = 0; i < mXML.getCountry(pos).sizeProvinces(); i++){
                mProvinces.add(mXML.getCountry(pos).getProvince(i).getLabel(mLanguage));
                mProvincesCode.add(mXML.getCountry(pos).getProvince(i).getCode());
            }

            mProvinceArrayAdapter = new ArrayAdapter<String>(ManageAccountActivity.this, 
                    android.R.layout.simple_spinner_item, mProvinces);
            mProvinceArrayAdapter.setDropDownViewResource(
                    android.R.layout.simple_spinner_dropdown_item);
            mProvinceSpinner.setAdapter(mProvinceArrayAdapter);
        }

        public void onNothingSelected(AdapterView<?> arg0) {
            // Do Nothing ...               
        }
    });
Run Code Online (Sandbox Code Playgroud)

又来了几行,这次来自fillUI方法():

Log.i(TAG, "Setting country based on user information.");
((Spinner) findViewById(R.id.spin_country))
    .setSelection(mCountriesCode.indexOf(mUser.getCountry()));
// TODO : Fix Provinces and States not being changed accordingly
Log.i(TAG, "Setting province based on user information.");
((Spinner) findViewById(R.id.spin_province))
    .setSelection(mProvincesCode.indexOf(mUser.getProvince())); 
Run Code Online (Sandbox Code Playgroud)

因此,我希望在我在fillUI()方法中设置选择后立即调用OnItemSelectedListener,但这不是在运行时发生的事情:S

这是我的LogCat摘录,显示当选择应用于country spinner时,不会调用Listener:

I/ManageAccountActivity(28108):根据用户信息设置国家/地区.

I/ManageAccountActivity(28108):根据用户信息设置省份.

I/ManageAccountActivity(28108):调用onCountrySelected(),位置:1

作为一个实验,我也尝试将fillUI()调用放在我的Activity的onStart方法中,但这并没有改变应用程序的反应方式.

在此先感谢您的任何指示,帮助或提示!

Nic*_*ick 23

您是否尝试使用两个参数设置微调器,第二个使用布尔值:

.setSelection(mProvincesCode.indexOf(mUser.getProvince()), true); 
Run Code Online (Sandbox Code Playgroud)

从开发者页面显示:

setSelection(int position, boolean animate)
//Jump directly to a specific item in the adapter data.
Run Code Online (Sandbox Code Playgroud)

  • 为什么Android如此破碎! (4认同)
  • 非常感谢你,我应该首先尝试将它设置为真:P.将两个微调器设置为setSelection(pos,true)就可以了. (3认同)
  • 对我也不起作用:( @AmanGoel 答案对我也不起作用 (3认同)
  • 我刚刚对此进行了测试,并使用带有“animate”的方法确实会触发“onItemSelected”,而没有的则不会。 (2认同)

小智 5

只需使用以下代码:

  ownerSpinnerVw.post(new Runnable() {
        @Override
        public void run() {
             ownerSpinnerVw.setSelection(position);
        }
    });
Run Code Online (Sandbox Code Playgroud)