18

私は現在、Android アプリケーションのアカウント管理アクティビティに取り組んでおり、スピナーのsetSelection()メソッドがスピナーに接続された 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();
    }
}   

スピナーとリスナーのバインディングを示す、アクティビティの作成時に呼び出される initializeUI() メソッドからの関連行:

    /** 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 ...               
        }
    });

また、今度は fillUI method() からの別の数行です。

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())); 

したがって、これにより、fillUI() メソッドで選択を設定した直後に OnItemSelectedListener が呼び出されることが期待されますが、それは実行時に起こっていることではありません:S

これは、国のスピナーに選択が適用されたときにリスナーが呼び出されないことを示す LogCat の抜粋です。

I/ManageAccountActivity(28108): ユーザー情報に基づいて国を設定します。

I/ManageAccountActivity(28108): ユーザー情報に基づいて州を設定します。

I/ManageAccountActivity(28108): onCountrySelected() が呼び出されました、位置: 1

実験として、アクティビティの onStart メソッドに fillUI() 呼び出しを入れてみましたが、アプリケーションの反応は変わりませんでした。

ポインタ、ヘルプ、またはヒントを事前にありがとう!

4

4 に答える 4

26

2 つの引数を使用してスピナーを設定しようとしましたか。2 番目の引数はブール値を使用します。

.setSelection(mProvincesCode.indexOf(mUser.getProvince()), true); 

開発者ページから、次のように表示されます。

setSelection(int position, boolean animate)
//Jump directly to a specific item in the adapter data.
于 2012-01-30T15:46:47.983 に答える
5

次のコードを使用してください。

  ownerSpinnerVw.post(new Runnable() {
        @Override
        public void run() {
             ownerSpinnerVw.setSelection(position);
        }
    });
于 2016-02-10T12:08:44.407 に答える