当相同的项目select进行时,android旋转工具触发事件

我想在微调器中select相同的项目时触发一个事件。 方法

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

只有当我们做出不同的select时才被调用。 我的目的是在任何项目被选中时显示一个敬酒,或者重新select相同的项目或者进行不同的select。

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

上面的方法并没有解决我的问题。

Solutions Collecting From Web of "当相同的项目select进行时,android旋转工具触发事件"

使用点击监听器来满足您的要求。 作为直接点击监听器上的微调不支持,所以让一个类扩展微调,并在点击方法,在这种方法做你想做的事情。

我发现旧的select保存在微调框架的variablesmOldSelectedPosition中。 微调正在使用这个值来检查是否select了相同的项目,如果它是相同的,它会忽略。 如果我们不想忽略这个,我所做的是使用reflection的一些脏代码。

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

此类将始终使旧select值无效,以便每次点击事件都被触发。 这可能不是完美的解决scheme。 谨慎使用。 🙂

希望这个帮助。 我试过,它的工作原理

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

由于我的声望还不足以直接评论@Suat的答案,所以我尝试了这种方法,它的作用像魅力,但我不清楚副作用是什么。 我想补充的是,应该添加额外的构造函数来避免错误。

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

}

您可以在您select的方法中添加方法名称

 Spinner `Spinner1`=(Spinner)findViewById(R.id.`declareid`) 

oBject已被声明为spinner

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