如何在设置适配器时避免使用Android Spinner Call itemSelectedListener?
-
30-09-2019 - |
题
看来Android的Spinner类(尽管我不确定,但通常是ListView)致电您的OnItemSelectedListener onItemSelected()
打电话后的方法 setAdapter()
, ,即使用户尚未明确选择任何内容。
我可以看到在许多情况下这将如何有用,但是有时候我只想要 onItemSelected()
实际选择项目时要调用。
有没有办法控制这种行为并让旋转器不打电话 onItemSelected()
设置适配器之后?
解决方案
我已经很久没有使用了这个解决方案了,所以我不完全相信它可以按预期工作,但是到目前为止,我的解决方法很幸运:
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方法,并创建了一个 资源ID 称为“ Spinnerstate”。
然后,每当我编程设置适配器时,我都会将“ Spinnerstate”标签设置为“ Init”,在射击事件中,将其设置为“准备就绪”并忽略事件。 (请注意,我的代码是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%的案例中,这不是所需的行为,而且我认为Google的设计并不是一个好的设计,但是您可以去。
我以前做过类似的事情,我使用了计数值。使用父适配器对象不完整,因为当视图刷新或 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
方法)。因此它会自动调用 onItemSelected(AdapterView<?> parent, View view, int position, long id)
旋转器的方法。我通过使用 onuserInteraction() 活动方法检查用户是否与旋转器进行交互的方法。如果是,请执行其他行动
宣布 iSererwress 全球布尔变量
在
onItemSelected
方法使用以下过程if(iSuserNtract){
//执行操作
} 别的{
//不执行动作
}
在活动中使用以下代码
@Override
public void onUserInteraction() {
super.onUserInteraction();
isUserIntract = true;
}