android spinner在选择相同项目时触发事件

android spinner在选择相同项目时触发事件,android,spinner,Android,Spinner,我想在微调器中选择同一项时触发事件。方法 @Override public void onItemSelected(AdapterView<?> parent, View arg1, int position, long arg3) { } @覆盖 已选择公共位置(AdapterView父对象、视图arg1、内部位置、, 长arg3){ } 仅当我们做出不同选择时才调用。我的目的是在选择任何项目时显示祝酒词,或者重新选择相同的项目,或者选择

我想在微调器中选择同一项时触发事件。方法

@Override
    public void onItemSelected(AdapterView<?> parent, View arg1, int position,
            long arg3) {
    }
@覆盖
已选择公共位置(AdapterView父对象、视图arg1、内部位置、,
长arg3){
}
仅当我们做出不同选择时才调用。我的目的是在选择任何项目时显示祝酒词,或者重新选择相同的项目,或者选择不同的项目

@Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
@覆盖
未选择公共无效(AdapterView父级){
}

上述方法无法解决我的问题。

您可以在所选方法项上添加方法名称

Spinner `Spinner1`=(Spinner)findViewById(R.id.`declareid`)
对象已为微调器声明

 @Override
        public void onItemSelected(AdapterView<?> parent, View arg1, int position,
                long arg3) 
    {
    ItemOnChange();
       }

private void ItemOnChange() {

        if(Spinner1.getSelectedItemPosition()>0){
        pd=ProgressDialog.show(this,"","Loading, Please wait .. ",true);

            final int spinner=Spinner1.getSelectedItemPosition();


            final Handler ThreadCallback=new Handler();
            final Runnable runInCityThread=new Runnable(){
                public void run(){
                    fnBindspimmer2();
                    pd.dismiss();
                }

            };

            new Thread(){
                @Override public void run(){

                Spinner2values();
                ThreadCallback.post(runInCityThread);
                }

            }.start();
        }



}
@覆盖
已选择公共位置(AdapterView父对象、视图arg1、内部位置、,
长arg3)
{
ItemOnChange();
}
私有void ItemOnChange(){
如果(Spinner1.getSelectedItemPosition()>0){
pd=ProgressDialog.show(此为“,”正在加载,请稍候…”,为true);
final int spinner=Spinner1.getSelectedItemPosition();
final Handler ThreadCallback=new Handler();
final Runnable runInCityThread=new Runnable(){
公开募捐{
fnBindspimmer2();
pd.解散();
}
};
新线程(){
@重写公共无效运行(){
喷丝头2值();
ThreadCallback.post(runInCityThread);
}
}.start();
}
}

使用click listener来满足您的需求。由于微调器上的直接单击侦听器不受支持,因此请创建一个类来扩展微调器并覆盖单击方法,并在该方法中执行您想要执行的操作。

我发现旧的选择保留在微调器层次结构中名为mOldSelectedPosition的变量中。微调器使用此值检查是否选择了相同的项目,如果相同,则忽略。如果我们不想忽略这一点,我所做的是一些使用反射的脏代码

package com.aradiom.amc.nativecomponents;

import java.lang.reflect.Field;

import android.content.Context;
import android.util.Log;
import android.widget.Spinner;

public class SpinnerTrigger extends Spinner {

public SpinnerTrigger(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

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

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) {
    ignoreOldSelectionByReflection();
    super.setSelection(position);
}

}
package com.aradiom.amc.nativecomponents;
导入java.lang.reflect.Field;
导入android.content.Context;
导入android.util.Log;
导入android.widget.Spinner;
公共类Spinner触发器扩展Spinner{
公共SpinnerTrigger(上下文){
超级(上下文);
//TODO自动生成的构造函数存根
}
@凌驾
公共无效设置选择(整型位置,布尔动画){
ignoreOldSelectionByReflection();
super.setSelection(位置、动画);
}
private void ignoreOldSelectionByReflection(){
试一试{
c类=this.getClass().getSuperclass().getSuperclass().getSuperclass();
Field reqField=c.getDeclaredField(“模具选择位置”);
reqField.setAccessible(真);
reqField.setInt(此为-1);
}捕获(例外e){
日志d(“私人例外”、“例外情况”,e);
//TODO:处理异常
}
}
@凌驾
公共选举(内部职位){
ignoreOldSelectionByReflection();
超级选举(职位);
}
}
此类将始终使oldselection值无效,以便每次单击事件都会被触发。
这可能不是完美的解决方案。小心使用。:)

由于我的声誉不高,无法直接评论@Suat的回答,我尝试了这种方法,效果很好,但我不清楚副作用是什么。 我想补充的是,应该添加额外的构造函数以避免错误

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

public SpinnerTrigger(Context context, AttributeSet attrs){
super(context,attrs);

}希望这能帮上忙。我试过了,效果很好

/** Spinner extension that calls onItemSelected even when the selection is the same as its previous value */
    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); }

      @Override public void
      setSelection(int position, boolean animate)
      {
        boolean sameSelected = position == getSelectedItemPosition();
        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)
      {
        boolean sameSelected = position == getSelectedItemPosition();
        super.setSelection(position);
        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());
        }
      }
    }

伟大的解决方案!我已经试着破解这个好几个小时了。谢谢