我在Spinner上遇到setSelection问题。我在代码中显示微调器时将值设置为预选,但它没有任何效果,并且始终选择列表中的第一个选项。代码如下所示:
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-part之外,代码按预期工作,我无法弄清楚原因。
微调器的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="" />
非常感谢帮助!
莱纳斯
答案 0 :(得分:110)
请在致电setSelection()
后将呼叫转移至setAdapter()
。
答案 1 :(得分:65)
我有类似的问题。就我而言,setAdaper
和setSelection
的顺序正确!已执行的表单onCreate
有效,但从onResume
执行时无效。
solution是致电setSelection(my_pos, true)
。注意第二个参数。
答案 2 :(得分:31)
您可以尝试
mSpinner.post(new Runnable() {
public void run() {
mSpinner.setSelection(1);
}
});
这将在创建视图后立即发布runnable动作
答案 3 :(得分:23)
在我的情况下,没有一个答案有效,所以我通过Handler
将setSelection排队new Handler().postDelayed(new Runnable() {
public void run() {
mSpinner.setSelection(1);
}
}, 100);
在慢速设备上运行时执行此操作可能会导致问题,但我正在为特定设备工作,因此可以使用此hack
答案 4 :(得分:1)
不要忘记,如果你调用动画,设置布局参数然后:) 例如:解决方案是调用setSelection(my_pos,true)。注意第二个参数。
LinearLayout.LayoutParams spinnerLp = (LinearLayout.LayoutParams) spinner.getLayoutParams();
spinner.setSelection(selectedPositionAge, true);
spinnerLp.gravity = Gravity.CENTER;
spinner.setLayoutParams(spinnerLp);
需要手动重置手动设置的微调器填充
答案 5 :(得分:1)
fragment : setSelection
内的微调器在活动首次开始onCreate
期间正常工作时遇到了同样的问题,但是当我旋转屏幕时却没有。我通过在片段的setSelection
方法中调用onViewStateRestored
而不是在onCreate
方法中调用它来解决它。我不确定,但我认为在视图完全加载之前您无法使用setSelection
,即使您可以findViewById
它。
答案 6 :(得分:1)
以前的答案都不适合我。但是,有效的是在我的片段的mSpinner
方法中(或在您的活动的onCreateView()
方法中)创建实例变量onCreate()
,然后在我的{{1方法......
onLoadFinished()
答案 7 :(得分:1)
Spinner.setSelection()
之前调用它,则 Spinner.setAdapter()
不起作用
在调用setAdapter()后尝试调用setSelection()
。
背后的原因:在设置适配器之前调用Spinner.Selection()
只是意味着你试图通过setSelection()将spinner设置为自定义索引。 t包含任何数据,或者我们可以说那个spinner有max item = 0。
所以setSelection(1)
表示为spinner设置索引为1,其中max item = 0;虽然微调器本身处理这个outofBoundIndex,但你的应用程序不会崩溃。
对SetSelection()
的调用应仅在setAdapter()之后
此外,如果您有一个Spinner.SetOnItemSelectedListener()
,并且您遇到问题onItemSelected(AdapterView<?> parent, View view, int position, long id)
在活动加载时位置值= 0,那么您应该使用此模式。
Spinner.SetAdapter()
Spinner.setSelection();
Spinner.setOnItemSelectedListener();
答案 8 :(得分:1)
使用此
sp2.setAdapter(sp2.getAdapter());
sp2.getAdapter().notifyDataSetChanged();
sp2.setSelection(0, false);
答案 9 :(得分:0)
试试这个,它对我有用:
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);
答案 10 :(得分:0)
Sometimes, we may not set listeners because the spinner may be set to a certain value, and disabled as per requirement.
This can lead to setSelection() not selecting a value, since it needs a listener.
Make sure that the Spinner's setOnItemSelectedListener() is set to a custom listener like below.
Even if spinner is disabled, we must set a listener like below, so that setSelection() method works.
spinnerListener.setOnItemSelectedListener(spinnerListener);
AdapterView.OnItemSelectedListener spinnerListener = new
AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
//Your code
}
}
spinnerListener.setSelection(0);