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


384

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

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

  • 第1类
  • 2类
  • 第3类

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


请点击此链接:如何在微调项目组选择] [1] [1]:stackoverflow.com/questions/16358563/...
马迪

1
您可以将索引传递到中spinner.setSelection()。那会很好。您还可以创建一种方法,以帮助您将索引与其实际字符串进行匹配。
塔斯林·奥塞尼

Answers:


736

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


285
谢谢,这很好用,在我执行此操作的同时,我还找到了一种无需循环访问适配器即可获取索引的方法。我用下面的mySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
粗硬

85
万一您没有适配器参考。mySpinner.setSelection((((ArrayAdapter)mySpinner.getAdapter())。getPosition(“ Value”)));
Kalel Wade 2014年

3
sexSpinner.setSelection(adapter.getPosition(mUser.getGender())== -1?0:adapter.getPosition(mUser.getGender()));
Goofyahead 2014年

在setAdapter()似乎总是始终显示第一个项目之后(Android 2.3),立即调用SetSelection(),即使在dropView中也选择了第一个项目。添加view.post()(@Marco Hernaiz Cao答案)为我修复它。
基督

3
如果微调框具有onItemSelectedListener(),则此方法不起作用。监听器不会被调用。
Don Larynx

79

这些答案中没有一个给我解决方案,仅与此兼容:

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

3
我在setAdapter()之后立即调用SetSelection()。这将始终显示第一个项目(Android 2.3),即使在dropView中选择了第一个也是如此。您的解决方案为我做到了。
基督

2
谢谢,那行得通!btw也适用于ListView.post.run()performItemClick()
Michael D.

如何根据尺寸选择最后一个?
jvargas

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

这段代码有一个错误,就是@Boardy想要选择Category 2我认为是String的选择(假设他尝试使用Spinner.SelectedText = "Category 2"),但是上面的代码是针对的long
阿伦·乔治

他正在从数据库填充类别,每个类别必须有一个ID。
Yaqub Ahmad 2012年

1
为什么要假设它是一个CursorAdapter?SpinnerAdapter也可以正常工作。
格雷格·恩尼斯

我认为您在这里有一个错误,应该是adapter.getItem(position),不是adapter.getItemId(position)
Vadim Kotov

29

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

阿伦·乔治Arun George)最受欢迎的答案是正确的,但在某些情况下不起作用。Marco HC使用Runnable
的答案是最后的手段,因为它会增加CPU负载。

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

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

    yourSpinner.setSelection(pos);
 }

但是它在onCreateView()中不起作用。我怀疑这是引起该主题兴趣的原因。

秘密是,在Android中,您无法以任何方法执行任何操作-oops :(-组件可能尚未准备就绪。作为另一个示例-您不能在onCreateView()和onResume()中都不能滚动ScrollView(在这里看到答案)


谢谢-我不知道Fragments具有onResume方法。
ToolmakerSteve

我会给+18,这样您的回答就会高于@Marco HC。您是唯一尝试按照
预定

15

要找到一个值并选择它:

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

12

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

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

1
使用DataAdapter的各种解决方案对我不起作用,但是使用在此示例中构建值的ArrayList可以解决问题。
ewall

8

最佳解决方案是:

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

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


4

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

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


1
是的,在使用SimpleCursorAdapter的情况下,spinnerRegion.getItemIdAtPosition(i)提供了一个Cursor,可用于获取列。
lalitm

3

这对我来说是工作。

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

+1呢?
SHADOW.NET

因为它是从0开始的,所以我们必须添加一个以获得正确的答案
Arpit Patel

2

如果您有联系人列表,则可以执行以下操作:

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

2

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

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

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

4
您可以添加一些文字来解释您的答案吗?
Kmeixner '16

2

这在本页其他位置的注释中有所说明,但认为将其引入答案很有用:

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

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

这是通过审查AbsSpinner确认代码setAdapter


当然,只有在适配器装满后才能选择一个项目。
CoolMind

2

这是我在Kotlin中使用的:

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

如果indexOf无法匹配,则返回-1,这似乎导致默认值被选择spinner.setSelection。我可以。
lasec0203

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

您不需要这样做。适配器具有一个getPosition(item)调用,该调用返回int位置。
tzg

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

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
}

-1

这为我工作:

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

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


-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;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.