Android:setSelection对Spinner没有影响

时间:2009-09-27 21:31:19

标签: android spinner

我在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="" />

非常感谢帮助!

莱纳斯

11 个答案:

答案 0 :(得分:110)

请在致电setSelection()后将呼叫转移至setAdapter()

答案 1 :(得分:65)

我有类似的问题。就我而言,setAdapersetSelection的顺序正确!已执行的表单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);