Spinner с пустым выбором по умолчанию
У меня есть Spinner
, который заполняется с помощью SimpleCursorAdapter
. Мой курсор имеет некоторые значения, но мне нужно Spinner
, чтобы показать пустую опцию по умолчанию.
Я не хочу использовать ArrayAdapter<String>
или CursorWrapper
в этом приложении по какой-либо причине.
По умолчанию должен быть более простой способ показать пустую опцию в Spinner
.
Ответы
Ответ 1
Вы можете просто скрыть нежелательный вид в адаптере spinner (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;
}
...
}
Ответ 2
Spinner
OnItemSelectedListener
выполняется также время компиляции, которое извлекает первый элемент для просмотра в Spinner
выбранном элементе.
Добавьте фиктивный элемент (String - null " "
) на ваш SimpleCursorAdapter
и используйте spinner.setSelected(int thatSpecificPostionYouJustAdded)
.
Ответ 3
Метод, который я иногда использую, чтобы добавить дополнительную запись, такую как "пустая" опция с помощью 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;
}
}
Ответ 4
После установки адаптера. call 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. взято из @melquiades answer:
/**
* 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());
}
}
}
}
Ответ 5
Создайте класс NullSpinnerItem
и 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.