【问题标题】:Android: setSelection having no effect on SpinnerAndroid:setSelection 对 Spinner 没有影响
【发布时间】:2010-12-01 20:31:41
【问题描述】:

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

非常感谢您的帮助!

莱纳斯

【问题讨论】:

    标签: android spinner


    【解决方案1】:

    尝试在呼叫setAdapter() 之后将呼叫转移到setSelection()

    【讨论】:

    • 太简单了! ;) 感谢 commonsware,再次为我节省了一些时间!
    • 谢谢,为我节省了几分钟;)
    • 嘿。已经将 setSelection 放在 setAdapter 之后,它仍然无法正常工作。它显示的是列表顶部的那个,而不是我要显示的那个。
    • 与@stanleysantoso 相同的问题
    • 在我的情况下,我在 setadapter 之后使用 setSelection,但它似乎对我不起作用
    【解决方案2】:

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

    solution 是调用setSelection(my_pos, true)。注意第二个参数。

    【讨论】:

    • 谢谢!我永远不会想到一个名为“animate”的参数会产生这种效果......
    • 非常感谢!我不会那样做的。我花了两个小时才找到你的帖子。
    • 我还在 OnResume 中进行了设置,但它不起作用。按照您的指示使用第二个参数,但现在微调器已从原始位置移开。
    • 非常感谢。我开始认为我是问题所在。
    • 在较新的 Android 版本上,此“错误”已得到修复,但如果您支持较旧的设备,您会感到惊讶 :) 顺便说一句 setSelection(my_pos, false) 也可以正常工作....
    【解决方案3】:

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

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

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

    【讨论】:

    • +1,这仅在我的情况下解决了,以前的情况没有。我在 Android 2.3.3 onCreate() 方法上,设置适配器后
    • +1 我发现这是让它在 OnItemSelectedListener 中工作的唯一方法。
    • 谢谢,因为没有其他任何工作......但这让我感觉很糟糕
    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 这是我的解决方案。基本上,在不是第一个的onCreate 中,视图状态随后由系统恢复。状态恢复机制将恢复其中的setSelection。解决方法是在状态恢复后运行setSelection
      • 这看起来很有希望,但是当我在 onViewStateRestored() 方法中调用 Spinner mySpinner = (Spinner)getView().findViewById(R.id.mySpinner); 时,它返回 null(当我在 onCreate() 中调用它时它不会返回 null)。
      【解决方案6】:

      你可以试试

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

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

        • 将 Spinner & Adapter 初始化移动到 onCreateView (Fragment) 中,足以让我在“onResume()”覆盖函数中工作
        【解决方案8】:

        试试这个,它对我有用:

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

        【讨论】:

          【解决方案9】:

          Spinner.setSelection()Spinner.setAdapter()之前调用是不行的

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

          背后的原因:当您在设置适配器之前调用Spinner.Selection() 时,仅表示您正在尝试通过 setSelection() 将微调器设置为自定义索引,但它不包含任何数据或者我们可以说那个 spinner 的 max item =0。

          so setSelection(1) 表示将最大项 = 0 的微调器的索引设置为 1;虽然微调器本身会处理这个 outofBoundIndex,但您的应用不会崩溃。

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

          另外,如果您有一个Spinner.SetOnItemSelectedListener(),并且您遇到onItemSelected(AdapterView&lt;?&gt; parent, View view, int position, long id) 在活动加载时以位置值=0 触发的问题,那么您应该使用此模式。

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

          【讨论】:

            【解决方案10】:

            使用这个

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

            【讨论】:

              【解决方案11】:

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

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

              【讨论】:

              • 我不知道你为什么得到-1,但你的解决方案对我有用。
              猜你喜欢
              • 2020-11-10
              • 2015-11-04
              • 2013-10-07
              • 2021-12-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-06-24
              • 2021-11-23
              相关资源
              最近更新 更多