如何按值而不是按位置设置微调器的选定项?

Pen*_*m10 283 java android adapter spinner

我有一个更新视图,我需要为Spinner预先选择存储在数据库中的值.

我记得这样的事情,但Adapter没有indexOf办法,所以我被困住了.

void setSpinner(String value)
{
    int pos = getSpinnerField().getAdapter().indexOf(value);
    getSpinnerField().setSelection(pos);
}
Run Code Online (Sandbox Code Playgroud)

小智 620

假设你Spinner的名字被命名mSpinner,它包含了一个选择:"一些价值".

要查找和比较Spinner中"某些值"的位置,请使用以下命令:

String compareValue = "some value";
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.select_state, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSpinner.setAdapter(adapter);
if (compareValue != null) {
    int spinnerPosition = adapter.getPosition(compareValue);
    mSpinner.setSelection(spinnerPosition);
}
Run Code Online (Sandbox Code Playgroud)

  • 使用自定义适配器,您必须编写(覆盖)getPosition()的代码 (5认同)
  • 所以我猜这不适用于CursorAdapter? (3认同)
  • 如果你没有检查一个字符串而不是一个对象内部的元素并且不能只使用toString(),那么因为spinner的值与toString()的输出不同. (3认同)

Akh*_*ain 133

一种基于值设置微调器的简单方法是

mySpinner.setSelection(getIndex(mySpinner, myValue));

 //private method of your class
 private int getIndex(Spinner spinner, String myString){
     for (int i=0;i<spinner.getCount();i++){
         if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(myString)){
             return i;
         }
     }

     return 0;
 } 
Run Code Online (Sandbox Code Playgroud)

复杂代码的方法已经存在,这只是更简单.

  • 当发现索引加速进程时,你忘了添加`break;`. (7认同)
  • @ban-geoengineering 我写了 `0` 作为备份场景。如果你设置了`-1`,那么什么项目在微调器中可见,我假设微调器适配器的第0个元素,添加-1也会增加检查值是否为-1的过重,因为设置-1会导致异常。 (3认同)
  • 如果找不到值,则应返回"-1"而不是"0" - 如我的回答所示:http://stackoverflow.com/a/32377917/1617737 :-) (2认同)

Mar*_*k B 34

我保留了Spinners中所有项目的单独ArrayList.这样我可以在ArrayList上执行indexOf,然后使用该值在Spinner中设置选择.

  • HashMap.get可以提供比ArrayList.indexOf更好的查找速度 (5认同)

Art*_*are 29

根据Merrill的回答,我想出了这个单行解决方案......它不是很漂亮,但是你可以责怪那些维护代码Spinner的人忽略了为此做的事情.

mySpinner.setSelection(((ArrayAdapter<String>)mySpinner.getAdapter()).getPosition(myString));
Run Code Online (Sandbox Code Playgroud)

你会得到一个关于如何ArrayAdapter<String>取消选中演员阵容的警告......真的,你可以ArrayAdapter像Merrill那样使用,但这只是交换另一个警告.


itz*_*har 13

如果你使用字符串数组这是最好的方法:

int selectionPosition= adapter.getPosition("YOUR_VALUE");
spinner.setSelection(selectionPosition);
Run Code Online (Sandbox Code Playgroud)


Prv*_*rvN 10

你也可以用它,

String[] baths = getResources().getStringArray(R.array.array_baths);
mSpnBaths.setSelection(Arrays.asList(baths).indexOf(value_here));
Run Code Online (Sandbox Code Playgroud)


xba*_*esx 8

如果您需要在任何旧适配器上使用indexOf方法(并且您不知道底层实现),那么您可以使用:

private int indexOf(final Adapter adapter, Object value)
{
    for (int index = 0, count = adapter.getCount(); index < count; ++index)
    {
        if (adapter.getItem(index).equals(value))
        {
            return index;
        }
    }
    return -1;
}
Run Code Online (Sandbox Code Playgroud)


max*_*ver 7

根据Merrill的回答,这里是如何处理CursorAdapter

CursorAdapter myAdapter = (CursorAdapter) spinner_listino.getAdapter(); //cast
    for(int i = 0; i < myAdapter.getCount(); i++)
    {
        if (myAdapter.getItemId(i) == ordine.getListino() )
        {
            this.spinner_listino.setSelection(i);
            break;
        }
    }
Run Code Online (Sandbox Code Playgroud)


Fai*_*ikh 6

使用以下行选择使用值:

mSpinner.setSelection(yourList.indexOf("value"));
Run Code Online (Sandbox Code Playgroud)