以编程方式设置旋转器的选定项目

我在一个android项目上工作,我正在使用一个旋转器,它使用一个从数据库填充的数组适配器。

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

  • 类别1
  • 第二类
  • 3级

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

490715 次浏览

使用以下: spinnerObject.setSelection(INDEX_OF_CATEGORY2) . < / p >

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

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

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

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

这些答案都没有给我答案,只有这个:

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

如果你有一个联系人列表,你可以这样做:

((Spinner) view.findViewById(R.id.mobile)).setSelection(spinnerContactPersonDesignationAdapter.getPosition(schoolContact.get(i).getCONT_DESIGNATION()));

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

yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
一些解释(至少对于Fragments -从未尝试纯活动)。希望它能帮助一些人更好地理解Android 乔治阿伦最流行的答案是正确的,但在某些情况下不工作。马可HC的答案使用Runnable wich是由于额外的CPU负载的最后手段。

答案是-你应该简单地选择正确的地方调用setSelection(),例如它工作对我来说:

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


yourSpinner.setSelection(pos);
}
< p > 但它在onCreateView()中不起作用。我想这就是人们对这个话题感兴趣的原因。< p > 秘密是,在Android中,你不能在任何方法中做任何你想做的事情——哎呀:(-组件可能还没有准备好。作为另一个例子-你不能在onCreateView()或onResume()中滚动ScrollView(见答案在这里)

你可以为这种工作创建一个泛型方法就像我在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);
}
}
}

找到一个值并选择它:

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

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

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
spRaca.setSelection(x);
break;
}
}

这是我的工作。

 spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);

在我的例子中,这段代码拯救了我:

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

你可以像这样简单地设置:spinner.setSelection(1),而不是1,你可以设置列表中你想显示的任何位置。

这招对我很管用:

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

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

最优解为:

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

这在本页其他地方的评论中有说明,但我认为把它拉出来作为一个答案是有用的:

当使用适配器时,我发现spinnerObject.setSelection(INDEX_OF_CATEGORY2)需要发生< em > < / em >后 setAdapter调用;否则,第一项总是初始选择。

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

这可以通过检查AbsSpinner 代码中的setAdapter来确认。

大部分时间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);
}
});

这是我在Kotlin中使用的:

spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))

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

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

我已经做了一些扩展函数Spinner加载数据和跟踪项目选择。

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
}

这是我正在使用的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)

这招对我很管用:

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


spinnerAdapter.notifyDataSetChanged();
}
});

是的,您可以通过在spinner的setSelection函数中传递所需spinner项的索引来实现这一点。例如:

spinnerObject.setSelection (INDEX_OF_CATEGORY)。

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

spinnerObjec.post {spinnerObjec.setSelection(yourIndex)}