Spinner с пустым выбором по умолчанию

У меня есть Spinner, который заполняется с помощью SimpleCursorAdapter. У моего курсора есть некоторые значения, но мне нужно, чтобы Spinner отображал пустую опцию по умолчанию.

По какой-то причине я не хочу использовать ArrayAdapter<String> или CursorWrapper в этом приложении.

Должен быть более простой способ показать пустую опцию в Spinner по умолчанию.


person AAP    schedule 28.01.2012    source источник
comment
вот ссылка, как вы можете это сделать (добавление фиктивного элемента) youtube.com/watch?v= FcMiw16bouA   -  person Abdu    schedule 13.10.2018


Ответы (5)


Вы можете просто скрыть нежелательный вид в адаптере счетчика (getDropDownView):

В моем примере кода defaultposition — это позиция, которую нужно скрыть (например, позиция «Выбрать значение»)

public class SpinnerOptionAdapter extends ArrayAdapter<optionsInfos> {

 ...

   @Override

  public View getDropDownView(int position, View convertView, ViewGroup parent)
  {   // This view starts when we click the spinner.
    View row = convertView;
    if(row == null)
    {
        LayoutInflater inflater = context.getLayoutInflater();
        row = inflater.inflate(R.layout.product_tab_produit_spinner_layout, parent, false);
    }

    ...

    optionsInfos item = data.get(position);


    if( (item != null) && ( position == defaultposition)) {
        row.setVisibility(View.GONE);
    } else {
        row.setVisibility(View.VISIBLE);
    }

   ....

    return row;
}


 ...
}
person Ralph    schedule 28.04.2012
comment
Я понимаю. Но у вас должен быть нулевой элемент, а у меня его нет в БД. это настоящая проблема. - person AAP; 29.04.2012

Spinner OnItemSelectedListener также работает во время компиляции, которая извлекает первый элемент для просмотра в Spinner выбранном элементе.

Добавьте фиктивный элемент (String - null " ") на свой SimpleCursorAdapter и используйте spinner.setSelected(int thatSpecificPostionYouJustAdded).

person IronBlossom    schedule 30.01.2012
comment
У ArrayAdapter‹String› есть метод add, а у SimpleCursorAdapter его нет. Не могли бы вы объяснить, как добавить нулевое значение с помощью кода без использования CursorWrapper? Спасибо - person AAP; 30.01.2012
comment
Извините за опоздание, может быть это как-то поможет. - person IronBlossom; 31.01.2012

Метод, который я иногда использую для добавления дополнительной записи, такой как «пустая» опция с SimpleCursorAdapter, предназначенным для Spinner, заключается в использовании предложения UNION в моем запросе курсора. EMPTY_SPINNER_STRING может быть чем-то вроде: «-- не указано--» или подобным. Используйте предложение «order by», чтобы сначала получить пустую запись и, следовательно, значение по умолчанию в Spinner. Грубый, но эффективный способ получить требуемый результат без изменения базовых данных таблицы. В моем примере я хочу, чтобы только определенные счетчики имели пустое значение по умолчанию (те, у которых тип модификатора «интенсивность».

public Cursor getLOV(String modifier_type)
//get the list of values (LOVS) for a given modifier
{
    if (mDb == null)
    {
        this.open();
    }
    try {
        MYSQL = "SELECT _ID AS '_id', code, name, type as 'DESC', ordering FROM "+codeTab+" WHERE type = '"+modifier_type+"'" +
                " ORDER BY ordering, LOWER(name)";
        if (modifier_type.equals("intensity")) { //then include a default empty record
            MYSQL = "SELECT _ID AS '_id', code, name as 'NAME', type as 'DESC', ordering FROM "+codeTab+" WHERE type = '"+modifier_type+"'" +
                    " UNION SELECT 9999 AS '_id', '' AS 'code', '"+EMPTY_SPINNER_STRING+"' AS 'NAME', 'intensity' AS 'DESC', 1 AS ordering ORDER BY ordering, name";
        }
        Log.d(TAG, "MYSQL = "+MYSQL);
        return mDb.rawQuery(MYSQL, null);
    }
    catch (SQLiteException exception) {
        Log.e("Database LOV query", exception.getLocalizedMessage());
        return null;
    }
}
person laurie_v    schedule 01.03.2013

После установки адаптера. вызовите setSelection (я использовал с 0) и сразу после этого установите цвет текста прозрачным.

    // Preselect the first to make the spinner text transparent
    spinner.setSelection(0, false);
    TextView selectedView = (TextView) spinner.getSelectedView();
    if (selectedView != null) {
        selectedView.setTextColor(getResources().getColor(R.color.transparent));
    }

Затем установите свой OnItemSelectedListener (при необходимости).

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    });

Это сделает счетчик пустым в первый раз. Но если пользователь выберет первый элемент, он ничего не сделает, потому что предварительно выбран 0. Для исправления этого я использовал этот подкласс счетчика. взято из ответ:


/** 
  * Spinner extension that calls onItemSelected even when the selection is the same as its previous value
  */
public class FVRSpinner extends Spinner {

    public FVRSpinner(Context context) {
        super(context);
    }

    public FVRSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FVRSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setSelection(int position, boolean animate) {
        boolean sameSelected = position == getSelectedItemPosition();
        super.setSelection(position, animate);
        if (sameSelected) {
            // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
            if (getOnItemSelectedListener() != null) {
                getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
            }
        }
    }

    @Override
    public void setSelection(int position) {
        boolean sameSelected = position == getSelectedItemPosition();
        super.setSelection(position);
        if (sameSelected) {
            // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
            if (getOnItemSelectedListener() != null) {
                getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
            }
        }
    }
}
person Shirane85    schedule 17.12.2015

Создайте класс NullSpinnerItem и вставьте его в начало списка.

// Class to represent the `null` selection in a List of items in a Spinner.
// There is no easy way to tell Spinner to also include a blank or null value. 
// This allows us to inject this as the first item in the List and handle null values easily.
//
public class NullSpinnerItem {

  @Override
  public String toString() {
    return "None";
  }

}

Затем, когда вы заполняете свой счетчик, просто получите свои предметы, а затем добавьте их в первую позицию:

items.add( 0, new NullSpinnerItem() ); // items are your items.

ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource( R.layout.spinner_list_item);

Spinner spinner = (Spinner) findViewById(spinnerId);
spinner.setAdapter(adapter);

Метод toString() — это то, что отображается в Spinner.

person Joshua Pinter    schedule 28.05.2019