Android:setSelection对Spinner没有影响

问题描述 投票:47回答:11

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

非常感谢帮助!

莱纳斯

android spinner
11个回答
110
投票

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


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);

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);

65
投票

我有类似的问题。在我的情况下setAdapersetSelection是正确的顺序!执行形式onCreate工作,但从onResume执行没有任何影响。

solution是打电话给setSelection(my_pos, true)。注意第二个参数。


31
投票

你可以试试

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

这将在创建视图后立即发布runnable操作


23
投票

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

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

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


1
投票

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

不要忘记,如果你调用动画,然后设置布局参数:)示例:

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

手动将填充设置为微调器需要手动重置


1
投票

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


1
投票

如果你在Spinner.setSelection()之前打电话,Spinner.setAdapter()不起作用

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

原因在这背后:当你在设置适配器之前调用Spinner.Selection()只是意味着你试图通过setSelection()设置微调器到自定义索引时它不包含任何数据或我们可以说那个微调器有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();

1
投票

用这个

    sp2.setAdapter(sp2.getAdapter());
    sp2.getAdapter().notifyDataSetChanged();
    sp2.setSelection(0, false);

1
投票

之前的答案都不适合我。但是,有效的是在我的片段的mSpinner方法中创建实例变量onCreateView()(或者在你的活动的onCreate()方法中),然后在我的onLoadFinished()方法中执行此操作...

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    adapter.swapCursor(cursor);
    //mSpinner.setAdapter(adapter);
    mSpinner.setSelection(mSelectedIndex);
}
© www.soinside.com 2019 - 2024. All rights reserved.