My Activity为微调器实现OnItemSelected侦听器。它具有在活动显示时触发onItemSelected回调的有趣问题。所以我使用了一个标志黑客来解决它(我讨厌它,但此时我只是想让应用程序工作)。
奇怪的是,即使在活动开始时调用回调,我的实际触摸选择也不起作用。我可以触摸列表,打开它,查看数组适配器中的字符串,甚至触摸它以使其解除 - 但是回调永远不会被调用。
我的代码:
public class MyActivity extends Activity implements OnItemSelectedListener {
…
private ArrayList<String> mMyTypes = null;
private ArrayAdapter<String> mMyAdapter = null;
private Spinner mMyTypeSpinner = null;
// hack for spinner
boolean isFirstRunWithSpinner = true;
在onCreate()中:
mMyTypeSpinner = (Spinner) findViewById(R.id.my_activity_spinner);
mMyTypes = new ArrayList<String>();
mMyTypes.add("Test string");
mMyAdapter = new ArrayAdapter<String>(this, R.layout.custom_spinner_style, mMyTypes);
mMyAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mMyTypeSpinner.setAdapter(mMyAdapter);
// spinner listener
mMyTypeSpinner.setOnItemSelectedListener(this);
回调:
@Override
public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
Toast
.makeText(ConfirmEditActivity.this, "Selected", Toast.LENGTH_LONG)
.show();
if( isFirstRunWithSpinner ) { isFirstRunWithSpinner = false; return; }
…
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
Toast
.makeText(ConfirmEditActivity.this, "Nothing", Toast.LENGTH_LONG)
.show();
}
当显示活动时,toast显示正确,但是当我在微调器中选择项目时,微调器会解除并且不再显示toast(更不用说回调中的其余代码无法执行)。 / p>
有任何意见吗?
我真的希望这简单......
答案 0 :(得分:1)
只有在选择新项目时,微调器才会响应ItemSelected事件。如果只显示一个项目,您显然只能在下拉列表中重新选择这一项。这是android微调器的正确行为。如果您的列表中有多个项目,并且所点击的项目不是当前选定的项目,则会触发onItemSelected。
来自android docs:
public abstract void onItemSelected(AdapterView parent,View view,int position,long id)
选择此视图中的项目时要调用的回调方法。仅当新选择的位置与先前选择的位置不同或者没有选定的项目时,才会调用此回调。
希望我能提供帮助。
答案 1 :(得分:0)
您是否尝试过setOnItemClickListener()而不是setOnItemSelectedListener()?
答案 2 :(得分:0)
如果您已经选择了微调器中的第一个项目并且您想要重新选择&#34;它(触发onItemSelected()回调)你可以通过调用:
重新设置适配器mMyTypeSpinner.setAdapter(mMyAdapter);
这似乎是一件枯燥的事情(因为你已经在onCreate()中设置了适配器),但是这个小技巧在我的情况下确实有用。