Android 为什么只在项目更改时调用OnItemSelectedListener,而不是在每个用户选择上调用?

Android 为什么只在项目更改时调用OnItemSelectedListener,而不是在每个用户选择上调用?,android,android-spinner,Android,Android Spinner,我在Android应用程序中使用微调器控件,并通过onItemSelectedListener()方法处理用户选择。当做出与当前选择不同的选择时,这似乎可以正常工作。我希望在某些条件下将所有微调器重置为默认值,并确保为所有微调器调用onItemSelectedListener() spinner.setAdapter(adapter); } 只有当用户选择发生变化时才会调用onItemSelectedListener(),这是Android语义的一部分吗。有没有办法强制调用onItem

我在Android应用程序中使用微调器控件,并通过
onItemSelectedListener()
方法处理用户选择。当做出与当前选择不同的选择时,这似乎可以正常工作。我希望在某些条件下将所有微调器重置为默认值,并确保为所有微调器调用
onItemSelectedListener()

   spinner.setAdapter(adapter);

}

只有当用户选择发生变化时才会调用
onItemSelectedListener()
,这是Android语义的一部分吗。有没有办法强制调用
onItemSelectedListener()

当您选择与当前所选项目相同的项目时,默认微调器不会触发任何事件。您需要制作一个自定义微调器才能执行此操作。如果希望触发微调器的“onItemSelected”(已选中微调器中的项目),请参见。
   spinner.setAdapter(adapter);

}
然后使用这个扩展spinner的自定义类,这对我很有用

   spinner.setAdapter(adapter);

}
然后像这样用微调器编辑你的活动,我改变了

  static Spinner spinner1;
   spinner.setAdapter(adapter);

}

   spinner.setAdapter(adapter);

}

   spinner.setAdapter(adapter);

}

   spinner.setAdapter(adapter);

}
我还更改了微调器所在的xml布局

    <Spinner
    android:id="@+id/spinner1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/place" />
   spinner.setAdapter(adapter);

}

   spinner.setAdapter(adapter);

}

微调器扩展类:

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

    }
   spinner.setAdapter(adapter);

}
package com.yourpackagename;
导入android.content.Context;
导入android.util.AttributeSet;
导入android.util.Log;
导入android.widget.Spinner;
导入android.widget.Toast;
导入java.lang.reflect.Field;
/**微调器扩展名,即使选择与以前的值相同,也会调用onItemSelected。
*ie扩展了“自定义微调器类”以获得“onItemSelected”事件,即使
*微调器已由用户选择*/
公共类NDSpinner扩展了Spinner{
公共NDSpinner(上下文)
{super(context);}
公共NDSpinner(上下文、属性集属性)
{super(context,attrs);}
公共NDSpinner(上下文、属性集属性、int-defStyle)
{super(context,attrs,defStyle);}
private void ignoreOldSelectionByReflection(){
试一试{
c类=this.getClass().getSuperclass().getSuperclass().getSuperclass();
Field reqField=c.getDeclaredField(“模具选择位置”);
reqField.setAccessible(真);
reqField.setInt(此为-1);
}捕获(例外e){
日志d(“私人例外”、“例外情况”,e);
//TODO:处理异常
}
}
@凌驾
公共无效设置选择(整型位置,布尔动画)
{
布尔sameSelected=position==getSelectedItemPosition();
ignoreOldSelectionByReflection();
super.setSelection(位置、动画);
如果(相同选择){
//如果选择了同一项,微调器不会调用OnItemSelectedListener,因此现在手动执行
getOnItemSelectedListener().onItemSelected(此,getSelectedView(),位置,getSelectedItemId());
}
}
@凌驾
公共选举(内部职位){
ignoreOldSelectionByReflection();
超级选举(职位);
}
}

如果要使用默认微调器每次添加相同的适配器:

   spinner.setAdapter(adapter);

}
@凌驾 已选择公共位置(适配器视图适配器,视图v,内部位置,长lng){

   spinner.setAdapter(adapter);

}

等等,您描述的与微调器的工作方式相反。当您使用OnItemClickListener时,微调器会引发RuntimeException,并且无论用户是重新选择了以前的选择还是做出了新的选择,都会调用OnItemSelectedListener…感谢您的反馈,我拼错了。我使用的是OnItemSelectedListener().我现在已编辑了我的邮件。