53

我在 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 部分之外,代码按预期工作,我只是不知道为什么。

微调器的 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="" />

非常感谢您的帮助!

莱纳斯

4

11 回答 11

136

尝试将呼叫移至setSelection()呼叫 至setAdapter()

于 2009-09-27T21:35:09.100 回答
74

我有类似的问题。就我而言setAdaper,并且setSelection顺序正确!执行形式onCreate有效,但执行时onResume无效。

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

于 2011-07-23T13:55:47.317 回答
37

你可以试试

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

这将发布可运行的操作,以便在创建视图后立即运行

于 2013-06-28T18:02:22.927 回答
29

在我的情况下,没有一个答案有效,所以我通过 Handler 将 setSelection 排队

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

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

于 2012-08-23T21:20:05.137 回答
4

以前的答案都不适合我。但是,起作用的是在我的片段方法(或您的活动方法)中创建实例变量mSpinneronCreateView()然后onCreate()在我的onLoadFinished()方法中执行此操作......

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    adapter.swapCursor(cursor);
    //mSpinner.setAdapter(adapter);
    mSpinner.setSelection(mSelectedIndex);
}
于 2015-08-02T18:03:11.823 回答
3

Spinner.setSelection()如果您之前调用它,则不起作用Spinner.setAdapter()

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

背后的原因:当您Spinner.Selection()在设置适配器之前调用它仅仅意味着您试图通过 setSelection() 将微调器设置为自定义索引,而它不包含任何数据,或者我们可以说微调器的最大项目 = 0。

所以setSelection(1)意味着将最大项目 = 0 的微调器的索引设置为 1;尽管微调器本身会处理此 outofBoundIndex,但您的应用程序不会崩溃。

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

此外,如果您有一个Spinner.SetOnItemSelectedListener()问题,onItemSelected(AdapterView<?> parent, View view, int position, long id)并且在活动加载时出现位置值=0 的问题,那么您应该使用此模式。

Spinner.SetAdapter()
Spinner.setSelection();
Spinner.setOnItemSelectedListener();
于 2017-06-23T07:18:32.627 回答
1

在活动的第一次开始期间,我在 a 内的微调器fragment : setSelection工作正常时遇到了同样的问题onCreate,但在我旋转屏幕时却没有。我通过在片段setSelection的方法内调用而不是在方法内调用它来解决它。我不确定,但我认为在视图完全加载之前你不能使用,即使你可以。onViewStateRestoredonCreatesetSelectionfindViewById

于 2013-06-28T16:35:26.277 回答
1

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

不要忘记,如果您调用 animate,请设置布局参数 :) 示例:

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

手动设置的填充到微调器需要手动重置

于 2013-01-09T12:00:23.493 回答
1

用这个

    sp2.setAdapter(sp2.getAdapter());
    sp2.getAdapter().notifyDataSetChanged();
    sp2.setSelection(0, false);
于 2018-03-05T01:44:14.650 回答
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);
于 2016-01-17T17:55:09.477 回答
0

有时,我们可能不会设置监听器,因为微调器可能设置为某个值,并根据需要禁用。

这可能导致 setSelection() 不选择值,因为它需要一个侦听器。

确保 Spinner 的 setOnItemSelectedListener() 设置为自定义侦听器,如下所示。

即使微调器被禁用,我们也必须像下面这样设置一个监听器,这样 setSelection() 方法才能工作。

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);
于 2018-07-25T04:21:51.870 回答