442

我正在开发一个 android 项目,我正在使用一个微调器,它使用从数据库填充的数组适配器。

我不知道如何从列表中以编程方式设置所选项目。例如,如果在微调器中我有以下项目:

  • 第一类
  • 第 2 类
  • 第 3 类

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

4

25 回答 25

852

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

于 2012-06-17T15:41:29.997 回答
94

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

mySpinner.post(new Runnable() {
    @Override
    public void run() {
        mySpinner.setSelection(position);
    }
});
于 2014-02-23T18:08:42.157 回答
43
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;
        }
    }
}

您可以使用上述方法:

selectSpinnerItemByValue(spinnerObject, desiredValue);

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

spinnerObject.setSelection(index);
于 2012-06-17T15:44:10.480 回答
34

一些解释(至少对于 Fragments - 从未尝试过纯 Activity)。希望它可以帮助某人更好地了解Android。

Arun George 最受欢迎的答案是正确的,但在某些情况下不起作用。Marco HC
的答案使用 Runnable,由于额外的 CPU 负载,这是最后的手段。

答案是 - 您应该简单地选择正确的位置来调用 setSelection(),例如它对我有用

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

    yourSpinner.setSelection(pos);
 }

但它不适用于 onCreateView()。我怀疑这就是对这个话题感兴趣的原因。

秘密在于,在 Android 中,您无法以任何方法做任何您想做的事情 - 哎呀:( - 组件可能还没有准备好。再举一个例子 - 您既不能在 onCreateView() 也不能在 onResume() 中滚动 ScrollView(在这里查看答案)

于 2014-08-14T18:45:39.870 回答
17

要找到一个值并选择它:

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;
        }
    }
}
于 2015-10-14T13:35:26.450 回答
15

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

yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
于 2014-08-08T14:18:53.083 回答
11

最优解是:

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

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

itemsSpinner.setSelection(itemsSpinner.getPosition("item2"));
于 2018-03-29T18:57:24.490 回答
7

您可以像我在我的 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);
        }
    }
}
于 2015-03-12T09:43:36.590 回答
6

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

于 2017-04-10T19:41:35.077 回答
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;
    }
}

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

于 2013-06-25T19:18:05.233 回答
3

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

spinnerObjec.post {spinnerObjec.setSelection(yourIndex)}
于 2021-11-21T19:23:00.190 回答
3

这对我来说是工作。

 spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);
于 2016-07-21T10:01:07.370 回答
3

这是我在 Kotlin 中使用的:

spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))
于 2019-03-25T13:51:40.280 回答
3

我知道已经回答了,但是选择一项的简单代码,非常简单:

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );
于 2016-03-22T22:00:51.007 回答
2

如果您有联系人列表,则可以这样做:

((Spinner) view.findViewById(R.id.mobile)).setSelection(spinnerContactPersonDesignationAdapter.getPosition(schoolContact.get(i).getCONT_DESIGNATION()));
于 2014-07-30T15:10:26.190 回答
2

这在本页其他地方的评论中有所说明,但认为将其提取到答案中很有用:

在使用适配器时,我发现spinnerObject.setSelection(INDEX_OF_CATEGORY2)需要在调用之后setAdapter发生;否则,第一项始终是初始选择。

// spinner setup...
spinnerObject.setAdapter(myAdapter);
spinnerObject.setSelection(INDEX_OF_CATEGORY2);

这可以通过查看 AbsSpinner代码来确认setAdapter

于 2018-07-18T10:53:20.417 回答
2
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
            if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
                spRaca.setSelection(x);
                break;
            }
        }
于 2016-04-28T17:01:07.647 回答
1

这是我正在使用的 Kotlin 扩展:

fun Spinner.setItem(list: Array<CharSequence>, value: String) {
    val index = list.indexOf(value)
    this.post { this.setSelection(index) }
}

用法:

spinnerPressure.setItem(resources.getTextArray(R.array.array_pressure), pressureUnit)
于 2020-10-12T17:06:14.583 回答
1

是的,您可以通过在微调器的 setSelection 函数中传递所需微调器项的索引来实现此目的。例如:

spinnerObject.setSelection(INDEX_OF_CATEGORY)。

于 2021-09-22T11:17:31.483 回答
0

这对我有用:

mySpinner.post(new Runnable() {
    @Override
    public void run() {
        mySpinner.setSelection(position);

        spinnerAdapter.notifyDataSetChanged();
    }
});
于 2021-09-22T10:20:21.880 回答
0

就我而言,这段代码拯救了我的一天:

public static void selectSpinnerItemByValue(Spinner spnr, long value) {
    SpinnerAdapter adapter = spnr.getAdapter();
    for (int position = 0; position < adapter.getCount(); position++) {
        if(adapter.getItemId(position) == value) {
            spnr.setSelection(position);
            return;
        }
    }
}
于 2016-11-22T16:23:05.443 回答
0

大多数时候spinner.setSelection(i); //i is 0 to (size-1) of adapter's size 都不起作用。如果你只是打电话spinner.setSelection(i);

这取决于你的逻辑。

如果视图已完全加载并且您想从界面调用它,我建议您调用

spinner.setAdapter(spinner_no_of_hospitals.getAdapter());
spinner.setSelection(i); // i is 0 or within adapter size

或者,如果您想在活动/片段生命周期之间进行更改,请像这样调用

spinner.post(new Runnable() {
  @Override public void run() {
    spinner.setSelection(i);
  }
});
于 2019-02-21T00:16:43.843 回答
0

我做了一些扩展功能,Spinner用于加载数据和跟踪项目选择。

微调器.kt

fun <T> Spinner.load(context: Context, items: List<T>, item: T? = null) {
    adapter = ArrayAdapter(context, android.R.layout.simple_spinner_item, items).apply {
        setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    }

    if (item != null && items.isNotEmpty()) setSelection(items.indexOf(item))
}

inline fun Spinner.onItemSelected(
    crossinline itemSelected: (
        parent: AdapterView<*>,
        view: View,
        position: Int,
        id: Long
    ) -> Unit
) {
    onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onNothingSelected(parent: AdapterView<*>?) {
        }

        override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
            itemSelected.invoke(parent, view, position, id)
        }
    }
}

用法示例

val list = listOf("String 1", "String 2", "String 3")
val defaultData = "String 2"

// load data to spinner
your_spinner.load(context, list, defaultData)

// load data without default selection, it points to first item
your_spinner.load(context, list)

// for watching item selection
your_spinner.onItemSelected { parent, view, position, id -> 
    // do on item selection
}
于 2019-07-04T14:10:39.550 回答
-1

从昨天开始我遇到了同样的问题。不幸的是,数组列表中的第一个项目默认显示在微调器小部件中。一个周转方法是找到数组列表中每个元素的前一个选定项目,并将其位置与第一个元素交换。这是代码。

OnResume()
{
int before_index = ShowLastSelectedElement();
if (isFound){
      Collections.swap(yourArrayList,before_index,0);
   }
adapter = new ArrayAdapter<String>(CurrentActivity.this,
                            android.R.layout.simple_spinner_item, yourArrayList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item;                    yourListView.setAdapter(adapter);
}
...
private int ShowLastSelectedElement() {
        String strName = "";
        int swap_index = 0;
        for (int i=0;i<societies.size();i++){
            strName = yourArrayList.get(i);
            if (strName.trim().toLowerCase().equals(lastselectedelement.trim().toLowerCase())){
                swap_index = i;
                isFound = true;
            }
        }
        return swap_index;
    }
于 2019-05-29T09:23:20.983 回答
-1

这对我有用:

@Override
protected void onStart() {
    super.onStart();
    mySpinner.setSelection(position);
}

它类似于@sberezin 的解决方案,但在 onStart() 中调用 setSelection()。

于 2017-08-05T03:20:27.773 回答