进入活动时会自动选择微调项目。 我该如何避免这种情况?

我的Android应用程序中有一个微调器,并且在进入活动时会自动触发onItemSelected()事件。

我该如何避免这种情况?

我们可以使用一个标志,并在真正触摸微调器时启用它。

 private boolean isSpinnerTouched = false; spinner.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { isSpinnerTouched = true; return false; } }); spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView adapter, View arg1, int arg2, long arg3) { if (!isSpinnerTouched) return; // do what you want } }); 

没有办法避免这种情况。

您可以添加一些标志,指示应用程序的准备情况,并在onItemSelected()方法中使用它来决定在每种情况下要做什么。

要添加Jerry Abraham,您应该在启用setOnItemSelectedListener之前清除选择

  Spinner mSpinner=(Spinner)findViewById(R.id.mySpinner); int initialSelectedPosition=mSpinner.getSelectedItemPosition(); mSpinner.setSelection(initialSelectedPosition, false); //clear selection mSpinner.setOnItemSelectedListener(this); //set listener after clearing section 

我已经解决了这个问题,你可以通过不向微调器设置任何默认值来避免这个问题

  int initialposition=spinner.getSelectedItemPosition(); spinner.setSelection(initialposition, false); 

这将避免进入onItemSelected()

我已find解决此问题的方法并在此处发布(带代码示例):

当没有假设时,Spinner onItemSelected()会执行

那么,您可以向初始适配器添加虚拟选择,并忽略setOnItemSelectedListener位置编号。 它不漂亮,但它的工作原理。 请参阅此代码以设置arrays适配器的项目。

 List names = new ArrayList(); names.add(""); names.addAll(realValues); 

然后在你的setOnItemSelectedListener你可以这样做:

  @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { if (position > 0) { String name = names.get(position - 1); } else { Log.d(TAG, "selected nothing or perhaps the dummy value"); } } 

这简单易行…用布尔值validation是否是第一次…

 Spinner mySpinner = (Spinner)findViewById(R.id.spinner_xml_pro); mySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView adapterView, View view, int i, long l) { if(isSpinnerInitial){ // globar var boolean isSpinnerInitial = false; //do something }else isSpinnerInitial=true; } @Override public void onNothingSelected(AdapterView adapterView) { } }); 

使用spinner.post(new Runnable()…)或其他我的源代码检查