Как установить выбранный элемент Spinner по значению, а не по положению? - PullRequest
274 голосов
/ 06 марта 2010

У меня есть представление обновления, где мне нужно предварительно выбрать значение, хранящееся в базе данных для Spinner.

Я имел в виду нечто подобное, но у Adapter нет метода indexOfтак что я застрял.

void setSpinner(String value)
{
    int pos = getSpinnerField().getAdapter().indexOf(value);
    getSpinnerField().setSelection(pos);
}

Ответы [ 24 ]

2 голосов
/ 03 сентября 2015

Вот как это сделать, если вы используете SimpleCursorAdapter (где columnName - это имя столбца БД, которое вы использовали для заполнения spinner):

private int getIndex(Spinner spinner, String columnName, String searchString) {

    //Log.d(LOG_TAG, "getIndex(" + searchString + ")");

    if (searchString == null || spinner.getCount() == 0) {
        return -1; // Not found
    }
    else {

        Cursor cursor = (Cursor)spinner.getItemAtPosition(0);

        for (int i = 0; i < spinner.getCount(); i++) {

            cursor.moveToPosition(i);
            String itemText = cursor.getString(cursor.getColumnIndex(columnName));

            if (itemText.equals(searchString)) {
                return i;
            }
        }
        return -1; // Not found
    }
}

(Возможно, вам также придется закрыть курсор в зависимости от того, используете ли вы загрузчик.)

Также (уточнение ответ Ахила ) это соответствующий способ сделать это, если вы заполняете свой Spinner из массива:

private int getIndex(Spinner spinner, String searchString) {

    if (searchString == null || spinner.getCount() == 0) {

        return -1; // Not found

    }
    else {

        for (int i = 0; i < spinner.getCount(); i++) {
            if (spinner.getItemAtPosition(i).toString().equals(searchString)) {
                return i; // Found!
            }
        }

        return -1; // Not found
    }
};
2 голосов
/ 10 июня 2015

Я использую специальный адаптер, для этого достаточно кода:

yourSpinner.setSelection(arrayAdapter.getPosition("Your Desired Text"));

Итак, ваш фрагмент кода будет выглядеть так:

void setSpinner(String value)
    {
         yourSpinner.setSelection(arrayAdapter.getPosition(value));
    }
1 голос
/ 27 января 2019

Если вы установите массив XML для счетчика в макете XML, вы можете сделать это

final Spinner hr = v.findViewById(R.id.chr);
final String[] hrs = getResources().getStringArray(R.array.hours);
if(myvalue!=null){
   for (int x = 0;x< hrs.length;x++){
      if(myvalue.equals(hrs[x])){
         hr.setSelection(x);
      }
   }
}
1 голос
/ 05 июля 2012

вот мое решение

List<Country> list = CountryBO.GetCountries(0);
CountriesAdapter dataAdapter = new CountriesAdapter(this,list);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spnCountries.setAdapter(dataAdapter);
spnCountries.setSelection(dataAdapter.getItemIndexById(userProfile.GetCountryId()));

и getItemIndexById ниже

public int getItemIndexById(String id) {
    for (Country item : this.items) {
        if(item.GetId().toString().equals(id.toString())){
            return this.items.indexOf(item);
        }
    }
    return 0;
}

Надеюсь, это поможет!

0 голосов
/ 26 апреля 2019

Так как мне нужно что-то, что также работает с Локализация , я пришел к этим двум методам:

    private int getArrayPositionForValue(final int arrayResId, final String value) {
        final Resources english = Utils.getLocalizedResources(this, new Locale("en"));
        final List<String> arrayValues = Arrays.asList(english.getStringArray(arrayResId));

        for (int position = 0; position < arrayValues.size(); position++) {
            if (arrayValues.get(position).equalsIgnoreCase(value)) {
                return position;
            }
        }
        Log.w(TAG, "getArrayPosition() --> return 0 (fallback); No index found for value = " + value);
        return 0;
    }

Как видите, я также наткнулся на дополнительную сложность чувствительности к регистру между arrays.xml и value, с которыми я сравниваю. Если у вас этого нет, описанный выше метод можно упростить до следующего вида:

return arrayValues.indexOf(value);

Статический вспомогательный метод

public static Resources getLocalizedResources(Context context, Locale desiredLocale) {
        Configuration conf = context.getResources().getConfiguration();
        conf = new Configuration(conf);
        conf.setLocale(desiredLocale);
        Context localizedContext = context.createConfigurationContext(conf);
        return localizedContext.getResources();
    }
0 голосов
/ 10 января 2019

Предположим, вам нужно заполнить счетчик из массива строк из ресурса, и вы хотите сохранить значение на сервере. Итак, это один из способов установить выбранное значение с сервера в счетчике.

pincodeSpinner.setSelection(resources.getStringArray(R.array.pincodes).indexOf(javaObject.pincode))

Надеюсь, это поможет! Постскриптум код есть в котлине!

0 голосов
/ 28 июня 2018

очень просто, просто используйте getSelectedItem();

Например:

ArrayAdapter<CharSequence> type=ArrayAdapter.createFromResource(this,R.array.admin_typee,android.R.layout.simple_spinner_dropdown_item);
        type.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mainType.setAdapter(type);

String group=mainType.getSelectedItem().toString();

вышеуказанный метод возвращает строковое значение

выше R.array.admin_type - это файл строковых ресурсов со значениями

просто создайте .xml файл в значениях >> strings

0 голосов
/ 12 февраля 2018
YourAdapter yourAdapter =
            new YourAdapter (getActivity(),
                    R.layout.list_view_item,arrData);

    yourAdapter .setDropDownViewResource(R.layout.list_view_item);
    mySpinner.setAdapter(yourAdapter );


    String strCompare = "Indonesia";

    for (int i = 0; i < arrData.length ; i++){
        if(arrData[i].getCode().equalsIgnoreCase(strCompare)){
                int spinnerPosition = yourAdapter.getPosition(arrData[i]);
                mySpinner.setSelection(spinnerPosition);
        }
    }
0 голосов
/ 26 декабря 2016

Вот мое, надеюсь, полное решение. У меня есть следующее перечисление:

public enum HTTPMethod {GET, HEAD}

используется в следующем классе

public class WebAddressRecord {
...
public HTTPMethod AccessMethod = HTTPMethod.HEAD;
...

Код для установки счетчика по члену перечисления HTTPMethod:

    Spinner mySpinner = (Spinner) findViewById(R.id.spinnerHttpmethod);
    ArrayAdapter<HTTPMethod> adapter = new ArrayAdapter<HTTPMethod>(this, android.R.layout.simple_spinner_item, HTTPMethod.values());
    mySpinner.setAdapter(adapter);
    int selectionPosition= adapter.getPosition(webAddressRecord.AccessMethod);
    mySpinner.setSelection(selectionPosition);

Где R.id.spinnerHttpmethod определено в файле макета, а android.R.layout.simple_spinner_item доставлено android-studio.

0 голосов
/ 11 января 2013

У меня возникла та же проблема при попытке выбрать правильный элемент в счетчике, заполненном с помощью cursorLoader. Я получил идентификатор элемента, который я хотел сначала выбрать из таблицы 1, а затем использовал CursorLoader для заполнения счетчика. В onLoadFinished я перебирал курсор, заполняя адаптер прядильщика, пока не нашел элемент, соответствующий идентификатору, который у меня уже был. Затем присваивается номер строки курсора выбранной позиции счетчика. Было бы неплохо иметь аналогичную функцию для передачи идентификатора значения, которое вы хотите выбрать в счетчике, при заполнении деталей в форме, содержащей сохраненные результаты счетчика.

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {  
  adapter.swapCursor(cursor);

  cursor.moveToFirst();

 int row_count = 0;

 int spinner_row = 0;

  while (spinner_row < 0 || row_count < cursor.getCount()){ // loop until end of cursor or the 
                                                             // ID is found 

    int cursorItemID = bCursor.getInt(cursor.getColumnIndexOrThrow(someTable.COLUMN_ID));

    if (knownID==cursorItemID){
    spinner_row  = row_count;  //set the spinner row value to the same value as the cursor row 

    }
cursor.moveToNext();

row_count++;

  }

}

spinner.setSelection(spinner_row ); //set the selected item in the spinner

}
...