我想在微调器中选择相同的项目时触发事件。方法
@Override
public void onItemSelected(AdapterView<?> parent, View arg1, int position,
long arg3) {
}
只有在进行了不同的选择时才会调用。我的目的是当选择任何项目时重新选择相同的项目或进行不同的选择时显示祝酒词。
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
上述方法无法解决我的问题。
答案 0 :(得分:18)
我发现在旋转器的层次结构中,旧的选择被保存在名为mOldSelectedPosition的变量中。 Spinner正在使用此值来检查是否选择了相同的项目,如果它是相同的,则忽略它。如果我们不想忽略这个我做的是使用反射的一些脏代码。
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);
}
}
此类将始终使oldselection值无效,以便每次触发click事件。 它可能不是完美的解决方案。谨慎使用。 :)
答案 1 :(得分:8)
希望这有帮助。我尝试了它的工作原理
/** 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());
}
}
}
答案 2 :(得分:3)
由于我的声誉不足以直接评论@Suat的答案,我尝试了这种方法,它就像魅力一样,但我不清楚副作用是什么。 我想添加的东西是,应该添加额外的构造函数以避免错误。
public SpinnerTrigger(Context context, AttributeSet attrs, int defStyle)
{ super(context, attrs, defStyle); }
public SpinnerTrigger(Context context, AttributeSet attrs){
super(context,attrs);
}
答案 3 :(得分:2)
您可以在所选项目上添加方法名称METHOD
Spinner `Spinner1`=(Spinner)findViewById(R.id.`declareid`)
已为spinner声明了oBject
@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();
}
}
答案 4 :(得分:0)
使用点击监听器来满足您的要求。由于不支持在微调器上直接单击侦听器,因此使类扩展微调器并在单击方法上过度骑行,并在此方法中执行您想要执行的操作。