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()
。
我有类似的问题。 在我的情况下setAdaper
和setSelection
是正确的顺序! 执行的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);