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());
}
}
}
伟大的解决方案!我已经试着破解这个好几个小时了。谢谢