为什么OnItemSelectedListener只在项目更改时被调用,而不是在每次用户选择时都被调用?

8

我在一个Android应用程序中使用了Spinner控件,并通过onItemSelectedListener()方法处理用户选择。当从当前选项进行不同的选择时,这似乎运行良好。在特定条件下,我想将所有Spinner重置为默认值,并确保对所有Spinner都调用onItemSelectedListener()

在Android的语义上,onItemSelectedListener()只有在用户选择更改时才会被调用吗?有没有办法强制调用onItemSelectedListener()


等一下,你描述了一个 Spinner 工作的相反方式。当你使用 OnItemClickListener 时,Spinner 会抛出 RuntimeException,而无论用户是重新选择之前的选项还是做出新的选择,OnItemSelectedListener 都会被调用... - Sam
感谢您的反馈,我拼错了。我正在使用onItemSelectedListener()。我已经编辑了我的消息。 - user1400716
3个回答

12
如果你想在选择Spinner中的项目时触发“onItemSelected”,即使再次点击已选中的项目,也可以使用此自定义类扩展Spinner。这对我有效。
然后像这样编辑您拥有Spinner的活动,我进行了更改。
  static Spinner spinner1;
  static NDSpinner spinner1;

   variables.spinner1 = (Spinner) findViewById(R.id.spinner1); 

   variables.spinner1 = (NDSpinner ) findViewById(R.id.spinner1); 

另外,我更改了包含下拉菜单的 XML 布局。

    <Spinner
    android:id="@+id/spinner1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/place" />

    <com.yourpackagename.NDSpinner 
     android:id="@+id/spinner1"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:text="@string/place" />

旋转器扩展类:

 package com.yourpackagename;
 import android.content.Context;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.widget.Spinner;
 import android.widget.Toast;
 import java.lang.reflect.Field;

     /** Spinner extension that calls onItemSelected even when the selection is the same as       its previous value. 
       *   ie This is extended "Customized class of Spinner" to  get the "onItemSelected"      event even if the item in the
     *  Spinner is already  selected by the user*/
    public class NDSpinner extends Spinner {

      public NDSpinner(Context context)
      { super(context); }

      public NDSpinner(Context context, AttributeSet attrs)
      { super(context, attrs); }

      public NDSpinner(Context context, AttributeSet attrs, int defStyle)
      { super(context, attrs, defStyle); }


      private void ignoreOldSelectionByReflection() {
            try {
                Class<?> c = this.getClass().getSuperclass().getSuperclass().getSuperclass();
                Field reqField = c.getDeclaredField("mOldSelectedPosition");
                reqField.setAccessible(true);
                reqField.setInt(this, -1);
            } catch (Exception e) {
                Log.d("Exception Private", "ex", e);
                // TODO: handle exception
            }
        }

      @Override
      public void  setSelection(int position, boolean animate)
      {
        boolean sameSelected = position == getSelectedItemPosition();
        ignoreOldSelectionByReflection();
        super.setSelection(position, animate);
        if (sameSelected) {
          // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
          getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());


        }
      }
      @Override
      public void setSelection(int position) {
          ignoreOldSelectionByReflection();
          super.setSelection(position);
      }

    }

3

0

如果您想使用默认的下拉框,请每次添加相同的适配器:

@Override public void onItemSelected(AdapterView adapter, View v, int position, long lng) {

   spinner.setAdapter(adapter);

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接