【问题标题】:Spinner.setSelection doesn't trigger OnItemSelectedListener properlySpinner.setSelection 没有正确触发 OnItemSelectedListener
【发布时间】:2017-12-18 14:11:50
【问题描述】:

我目前正在为我的 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();
    }
}   

在 Activity 创建时调用的 initializeUI() 方法的相关行显示了 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 ...               
        }
    });

又是几行,这次来自 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())); 

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

Here's my LogCat extract that shows that the Listener isn't called when the selection is applied to the country spinner:

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

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

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

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

提前感谢任何指示、帮助或提示!

【问题讨论】:

  • ,OnItemSelectedListener 仅在您对微调器执行某些操作时才会触发..更改
  • 嗯,我确实改变了它......将选择从 0 移动到 1 不会被视为改变吗?

标签: android spinner android-spinner


【解决方案1】:

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

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

developers page 显示:

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

【讨论】:

  • 我已经在 animate 参数为 false 的情况下进行了尝试(从另一个线程获取)我将在参数设置为 true 的情况下进行尝试。
  • 非常感谢,我应该首先尝试将其设置为 true :P。将两个微调器设置为 setSelection(pos, true) 就可以了。
  • 我刚刚对此进行了测试,使用animate 的方法确实会触发onItemSelected,而没有的则不会。
  • 安卓为什么这么烂!
  • 对我也不起作用:(@AmanGoel 的回答也对我不起作用
【解决方案2】:

只需使用以下代码:

  ownerSpinnerVw.post(new Runnable() {
        @Override
        public void run() {
             ownerSpinnerVw.setSelection(position);
        }
    });

【讨论】:

    【解决方案3】:

    我找到了解决我的问题的方法,就是将它添加到 onCreate 方法中。该程序有效,但仅适用于第一个选择。第二次选择程序时,模拟器会崩溃。

    spinner.setOnItemSelectedListener(this);
    

    【讨论】:

    • 正如您在帖子中提到的。这个答案不起作用。请将其添加为评论。
    【解决方案4】:

    我发现如果你声明 setSelection(pos) 有效

    yourSpinner.setOnItemSelectedListener(null);
    

    在那之前。

    【讨论】:

      猜你喜欢
      • 2017-11-22
      • 1970-01-01
      • 2016-01-16
      • 2020-03-31
      • 2019-02-28
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多