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

时间:2012-06-17 15:39:19

标签: android spinner

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

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

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

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

22 个答案:

答案 0 :(得分:660)

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

答案 1 :(得分:71)

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

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

答案 2 :(得分:33)

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

答案 3 :(得分:27)

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

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

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

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

    yourSpinner.setSelection(pos);
 }

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

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

答案 4 :(得分:11)

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

yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));

答案 5 :(得分:10)

要查找值并选择它:

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

答案 6 :(得分: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);
        }
    }
}

答案 7 :(得分:4)

  

最佳解决方案是:

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

答案 8 :(得分:3)

我有一个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;
    }
}

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

答案 9 :(得分:2)

这对我有用。

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

答案 10 :(得分:2)

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

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );

答案 13 :(得分:1)

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

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

答案 14 :(得分:1)

此内容在本页其他位置的注释中有所说明,但认为将其拉出答案很有用:

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

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

可以通过查看AbsSpinner code中的setAdapter来确认。

答案 15 :(得分:0)

就我而言,这段代码节省了我的一天:

      library(RColorBrewer)
  n <- 60
  qual_col_pals = brewer.pal.info[brewer.pal.info$category == 'qual',]
  col_vector = unlist(mapply(brewer.pal, qual_col_pals$maxcolors, rownames(qual_col_pals)))

    ggplot(d, 
         aes(x=factor(Group),
             y=  value,
             group= Name , color =Name)) +
  geom_point()+geom_line()  +
         scale_color_manual(name="name",
                   labels = unique(d$Name)
                  ,
                   values=  col_vector[14:(14+(length(unique(d$Name)) )-1 )]
     )

答案 16 :(得分: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);
  }
});

答案 17 :(得分:0)

这是我在Kotlin中使用的

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

答案 18 :(得分:0)

我做了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
}

答案 19 :(得分:0)

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

答案 20 :(得分:-1)

这对我有用:

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

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

答案 21 :(得分:-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;
    }