Android:setSelection对Spinner没有影响

我在Spinner中遇到setSelection问题。 当在代码中显示微调器时,我将该值设置为预选,但是它没有任何作用,并且总是select列表中的第一个选项。 代码如下所示:

LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View dialogView = li.inflate(R.layout.edit_event, null); ... ArrayList<String> routes = new ArrayList<String>(); // routes filled with values at runtime ... ArrayAdapter<String> aa = new ArrayAdapter<String>(GOFdroid.this, android.R.layout.simple_spinner_item, routes); aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); Spinner destSpinner = (Spinner) dialogView.findViewById(R.id.edit_event_destination); String dest = events.get(pos).getDestination(); int routesPos = routes.indexOf(dest); Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos); destSpinner.setSelection(routesPos); destSpinner.setAdapter(aa); 

代码的工作原理除了setSelection部分,我只是不明白为什么。

微调器的XML布局看起来像这样(不是整个布局,只有微调器部分):

 // DESTINATION <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Destination:" /> <Spinner android:id="@+id/edit_event_destination" android:layout_width="fill_parent" android:layout_height="wrap_content" android:prompt="@string/choose_dest" android:layout_marginBottom="10dip" android:text="" /> 

非常感谢帮助!

莱纳斯

尝试在调用setAdapter()之后将调用移动到setSelection() setAdapter()

我有类似的问题。 在我的情况下setAdapersetSelection是正确的顺序! 执行的formsonCreate工作,但从onResume执行时没有效果。

解决方法是调用setSelection(my_pos, true) 。 注意第二个参数。

你可以试试

 mSpinner.post(new Runnable() { public void run() { mSpinner.setSelection(1); } }); 

这将在创build视图后立即运行可运行的操作

在我的情况下,没有答案的工作,所以我排队通过处理程序的setSelection

 new Handler().postDelayed(new Runnable() { public void run() { mSpinner.setSelection(1); } }, 100); 

这样做可能会导致在慢速设备上运行时出现问题,但我正在为特定设备工作,所以可以使用这个黑客

解决方法是调用setSelection(my_pos,true)。 注意第二个参数。

不要忘了,如果你调用animation,设置布局参数然后:)例如:

 LinearLayout.LayoutParams spinnerLp = (LinearLayout.LayoutParams) spinner.getLayoutParams(); spinner.setSelection(selectedPositionAge, true); spinnerLp.gravity = Gravity.CENTER; spinner.setLayoutParams(spinnerLp); 

手动设置的微调需要手动复位

我有一个fragment : setSelection内的微调相同的问题fragment : setSelection在第一次开始的活动onCreate时正常工作,但不是当我旋转屏幕。 我通过在片段的onViewStateRestored方法内调用setSelection而不是在onCreate方法内调用它来解决它。 我不知道,但我认为你不能使用setSelection直到视图被完全加载,即使你可以findfindViewById它。

没有以前的答案为我工作。 但是,我的片段的onCreateView()方法中创build了实例variablesmSpinner (或者我期望的是活动的onCreate()方法),然后在我的onLoadFinished()方法…

 @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { adapter.swapCursor(cursor); mSpinner.setSelection(mSelectedIndex); } 

如果在Spinner.setAdapter()之前调用它, Spinner.setAdapter()不起作用。

尝试在调用setAdapter()之后调用setSelection() ()。

原因在这之后 :当你在调用适配器之前调用Spinner.Selection() ,只是意味着你正在试图通过setSelection()设置自定义索引,当它不包含任何数据,或者我们可以说这个spinner有max item = 0。

所以setSelection(1)意思是将索引设置为1,对于max item = 0的微调框; 虽然微调本身处理这个outBoundIndex,所以你的应用程序不会崩溃。

SetSelection()调用应该在setAdapter()之后

此外,如果你有一个Spinner.SetOnItemSelectedListener()并且你有问题, onItemSelected(AdapterView<?> parent, View view, int position, long id)在活动加载时触发位置值= 0,然后你应该使用这个模式。

 Spinner.SetAdapter() Spinner.setSelection(); Spinner.setOnItemSelectedListener(); 

试试这个,它为我工作:

 Spinner destSpinner = (Spinner)dialogView.findViewById(R.id.edit_event_destination); destSpinner.setSelection(0); String dest = events.get(pos).getDestination(); int routesPos = routes.indexOf(dest); destSpinner.setAdapter(aa); Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos); destSpinner.setSelection(routesPos);