以编程方式设置微调器的选定项

Boa*_*rdy 358 android spinner

我正在研究一个android项目,我正在使用一个使用数组适配器的微调器,该数组适配器是从数据库中填充的.

我无法找到如何从列表中以编程方式设置所选项目.例如,如果在微调器中我有以下项目:

  • 第1类
  • 第2类
  • 第3类

创建屏幕时,如何以编程方式将类别2设为选定项目.我认为它可能类似于c#IE Spinner.SelectedText ="Category 2"但似乎没有任何类似于Android的方法.

Aru*_*rge 701

使用以下内容: spinnerObject.setSelection(INDEX_OF_CATEGORY2).

  • 谢谢,这很好用,而我这样做我也找到了一种获取索引的方法,而无需循环适配器.我使用了以下``mySpinner.setSelection(arrayAdapter.getPosition("Category 2"));`` (272认同)
  • 如果你没有适配器来引用.mySpinner.setSelection(((ArrayAdapter)mySpinner.getAdapter())为getPosition( "值").); (80认同)
  • 如果 Spinner 具有 onItemSelectedListener(),这将不起作用。监听器不会被调用。 (6认同)
  • sexSpinner.setSelection(adapter.getPosition(mUser.getGender()) == -1 ? 0 : adapter.getPosition(mUser.getGender())); (4认同)

Mar*_* HC 76

这些答案中没有一个给我解决方案,只有这个:

mySpinner.post(new Runnable() {
    @Override
    public void run() {
        mySpinner.setSelection(position);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 我在setAdapter()之后调用SetSelection().这始终显示第1项(Android 2.3),甚至在dropView中选择了好项目.你的解决方案是为我做的. (3认同)
  • 谢谢,这很有效!顺便说一句也适用于ListView.post.run()performItemClick() (2认同)
  • 应该将其标记为正确答案。 (2认同)

Yaq*_*mad 35

public static void selectSpinnerItemByValue(Spinner spnr, long value) {
    SimpleCursorAdapter adapter = (SimpleCursorAdapter) spnr.getAdapter();
    for (int position = 0; position < adapter.getCount(); position++) {
        if(adapter.getItemId(position) == value) {
            spnr.setSelection(position);
            return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用以上内容:

selectSpinnerItemByValue(spinnerObject, desiredValue);
Run Code Online (Sandbox Code Playgroud)

当然你也可以直接选择索引

spinnerObject.setSelection(index);
Run Code Online (Sandbox Code Playgroud)


sbe*_*zin 28

一些解释(至少对于碎片 - 从未尝试过纯活动).希望它能帮助别人更好地理解Android.

Arun George 最热门的回答是正确的,但在某些情况下不起作用.由于额外的CPU负载
,Marco HC使用Runnable 的答案是最后的手段.

答案是 - 你应该只选择正确的地方来调用setSelection(),例如它适用于我:

@Override
public void onResume() {
    super.onResume();

    yourSpinner.setSelection(pos);
 }
Run Code Online (Sandbox Code Playgroud)

但它不能在onCreateView()中工作.我怀疑这是对这个话题感兴趣的原因.

秘诀是,使用Android,你无法在任何方法中做任何事情 - oops :( - 组件可能还没有准备好.另一个例子 - 你不能在onCreateView()和onResume()中滚动ScrollView(看到这里的答案)


Ric*_*Dev 11

为什么不使用DB中的值并将它们存储在ArrayList上,然后使用:

yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
Run Code Online (Sandbox Code Playgroud)


Fer*_*nch 11

要查找值并选择它:

private void selectValue(Spinner spinner, Object value) {
    for (int i = 0; i < spinner.getCount(); i++) {
        if (spinner.getItemAtPosition(i).equals(value)) {
            spinner.setSelection(i);
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

最佳解决方案是:

    public String[] items= new String[]{"item1","item2","item3"};
    // here you can use array or list 
    ArrayAdapter adapter= new ArrayAdapter(Your_Context, R.layout.support_simple_spinner_dropdown_item, items);
    final Spinner itemsSpinner= (Spinner) findViewById(R.id.itemSpinner);
itemsSpinner.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

要获取商品的位置,请自动添加以下语句

itemsSpinner.setSelection(itemsSpinner.getPosition("item2"));
Run Code Online (Sandbox Code Playgroud)

  • 无法解析“Spinner”中的“getPosition”方法 (2认同)

小智 6

您可以像我在UtilityClass中那样为这种工作制作通用方法

public void SetSpinnerSelection(Spinner spinner,String[] array,String text) {
    for(int i=0;i<array.length;i++) {
        if(array[i].equals(text)) {
            spinner.setSelection(i);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以轻松地设置如下:spinner.setSelection(1),而不是 1,您可以设置您想要显示的列表的任何位置。


ארי*_*עדן 6

在 Kotlin 中,我找到了一个使用 lambda 的简单解决方案:

spinnerObjec.post {spinnerObjec.setSelection(yourIndex)}
Run Code Online (Sandbox Code Playgroud)


paz*_*ndo 5

我有一个 SimpleCursorAdapter,所以我必须复制数据以使用这篇文章中的 respose。所以,我建议你试试这种方式:

for (int i = 0; i < spinnerRegion.getAdapter().getCount(); i++) {
    if (spinnerRegion.getItemIdAtPosition(i) == Integer
        .valueOf(signal.getInt(signal
            .getColumnIndexOrThrow("id_region")))) {
        spinnerRegion.setSelection(i);
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这是一个真正的方式