看来android的Spinner类(一般可能是ListView,虽然我不确定)在你调用onItemSelected()
之后调用你的OnItemSelectedListener的setAdapter()
方法,即使用户没有明确选择了任何东西。
我可以看到这在许多情况下会有用,但有时我只想在实际专门选择项目时调用onItemSelected()
。
有没有办法控制此行为,并且在设置适配器后Spinner不会调用onItemSelected()
?
答案 0 :(得分:4)
我已经很久没有使用过这个解决方案了,所以我并不完全相信它能按预期运行,但到目前为止我已经有了这个解决方法的运气:
spinner.setOnItemSelectedListener( new OnItemSelectedListener() {
protected Adapter initializedAdapter = null;
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// Always ignore the initial selection performed after setAdapter
if( initializedAdapter !=parent.getAdapter() ) {
initializedAdapter = parent.getAdapter();
return;
}
...
}
}
有更好的方法吗?
答案 1 :(得分:3)
将侦听器添加到微调器,如下所示:
spinner.post(new Runnable(){
public void run()
{
spinner.setOnItemSelectedListener( new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
...
}
}
}
});
答案 2 :(得分:0)
我使用了setTag和getTag方法,并创建了一个名为“spinnerstate”的resource id。
然后,每当我以编程方式设置适配器时,我将“spinnerstate”标记设置为“init”,并在触发事件中将其设置为“ready”并忽略该事件。 (注意我的代码是Mono for Android,它看起来会有所不同):
设置适配器:
profileSpn.SetTag (Resource.Id.spinnerstate, "init");
profileSpn.Adapter = new ArrayAdapter (this, Android.Resource.Layout.SimpleSpinnerItem, items.ToArray ());
项目选定事件:
string state = (string)((Spinner)sender).GetTag (Resource.Id.spinnerstate);
if (state == "init") {
((Spinner)sender).SetTag (Resource.Id.spinnerstate, "ready");
return;
}
我同意在几乎100%的情况下这不是理想的行为,我不认为这是Google的好设计,但你去了。
答案 3 :(得分:0)
我的活动中有三个微调器,并且所有微调器适配器数据都已在运行时填充(从onCreate
方法调用之后的Web服务数据)。因此它会自动调用微调器的onItemSelected(AdapterView<?> parent, View view, int position, long id)
方法。
我使用onUserInteraction()活动方法解决了这个问题
检查用户是否与微调器交互的方法。如果是,则执行其他操作
全局声明 isUserIntract 布尔变量
在onItemSelected
方法中使用以下程序
如果(isUserIntract) {
//执行行动
} 否则{
//不执行操作
}
在活动中使用以下代码
@Override
public void onUserInteraction() {
super.onUserInteraction();
isUserIntract = true;
}