即使onItemSelected被调用,Spinner也不会响应点击次数?

时间:2010-07-22 20:04:34

标签: android

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>

有任何意见吗?

我真的希望这简单......

3 个答案:

答案 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()中设置了适配器),但是这个小技巧在我的情况下确实有用。