繁体   English   中英

Android:setSelection对Spinner没有影响

[英]Android: setSelection having no effect on 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="" />

非常感谢帮助!

莱纳斯

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

我有类似的问题。 在我的情况下, setAdapersetSelection顺序正确! 已执行的表单onCreate工作,但从onResume执行时没有任何效果。

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

你可以试试

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

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

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

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

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

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

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

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 ,即使你可以findViewById它。

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

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    adapter.swapCursor(cursor);
    //mSpinner.setAdapter(adapter);
    mSpinner.setSelection(mSelectedIndex);
}

Spinner.setSelection()如果你之前调用它不工作Spinner.setAdapter()

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

原因在此背后 :当你在设置适配器之前调用Spinner.Selection() ,只是意味着当它不包含任何数据时我们试图通过setSelection()将微调器设置为自定义索引,或者我们可以说这个微调器具有最大值item = 0。

所以setSelection(1)表示对于具有max item = 0的微调器,将index设置为1; 虽然微调器本身处理这个outofBoundIndex,所以你的应用程序不会崩溃。

SetSelection()调用应仅在setAdapter()之后

此外,如果你有一个Spinner.SetOnItemSelectedListener()并且你有问题onItemSelected(AdapterView<?> parent, View view, int position, long id)在活动加载时tiggered与位置值= 0然后你应该使用这种模式。

Spinner.SetAdapter()
Spinner.setSelection();
Spinner.setOnItemSelectedListener();

用这个

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

试试这个,它对我有用:

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

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

这可能导致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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM