即使用户尚未明确选择任何内容,android 的 Spinner 类(也可能是一般的 ListView,尽管我不确定)似乎onItemSelected()
在您调用后调用您的 OnItemSelectedListener 方法。setAdapter()
我可以看到这在许多情况下是如何有用的,但有时我只想onItemSelected()
在实际专门选择一个项目时被调用。
有没有办法控制这种行为并onItemSelected()
在设置适配器后让 Spinner 不调用?
即使用户尚未明确选择任何内容,android 的 Spinner 类(也可能是一般的 ListView,尽管我不确定)似乎onItemSelected()
在您调用后调用您的 OnItemSelectedListener 方法。setAdapter()
我可以看到这在许多情况下是如何有用的,但有时我只想onItemSelected()
在实际专门选择一个项目时被调用。
有没有办法控制这种行为并onItemSelected()
在设置适配器后让 Spinner 不调用?
我已经很久没有使用这个解决方案了,所以我并不完全相信它可以按预期工作,但是到目前为止我对这个解决方法很幸运:
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;
}
...
}
}
有没有更好的办法?
将侦听器添加到微调器,如下所示:
spinner.post(new Runnable(){
public void run()
{
spinner.setOnItemSelectedListener( new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
...
}
}
}
});
我使用了setTag和 getTag 方法,并创建了一个名为“ spinnerstate”的资源 ID 。
然后,每当我以编程方式设置适配器时,我都会将“spinnerstate”标签设置为“init”,并在触发的事件中将其设置为“ready”并忽略该事件。(注意我的代码是 Mono for Android se 它看起来会有所不同):
设置适配器:
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% 的情况下都不是理想的行为,而且我认为这不是谷歌的好设计,但你去吧。
我以前做过类似的事情,我使用计数值。使用父适配器对象是不完整的,因为刷新或getView()
再次调用视图时可能会出现问题。
因此,我建议使用计数器数组。
首先,在适配器中全局定义计数数组。
private int isInitializedView[];
然后在 getView() 上对其进行初始化。
isInitializedView[position] = 0;
在选择侦听器中,如果它已经初始化,请执行您想要的操作。
holder.mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
isInitializedView[position]++;
if(isInitializedView[position] > 1) {
// do someting that you want
}
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {}
});
(注意,isInitializedView[position]++;
可以在if()
例程之后,只有当这个值为 时才触发事件>0
。这是你的选择。)
我的活动中有三个微调器,并且所有微调器适配器数据都已在运行时填充(从onCreate
方法调用后的 Web 服务数据)。所以它会自动调用onItemSelected(AdapterView<?> parent, View view, int position, long id)
微调器的方法。我通过使用活动的onUserInteraction()方法解决了这个问题,检查用户是否与微调器交互的这个方法。如果是,则执行操作,否则不执行
全局声明isUserIntract布尔变量
在onItemSelected
方法中使用以下程序
如果(isUserIntract){
//执行动作
} 别的{
//不执行动作
}
在活动中使用以下代码
@覆盖
public void onUserInteraction() {
super.onUserInteraction();
isUserIntract = true;
}