Короткий ответ: вы можете сделать это программно - либо назначив новый ArrayAdapter Spinner, либо удалив / добавив элементы из существующего ArrayAdapter.
Более длинный ответ заключается в том, что вы должны бытьочень осторожно полагаясь на OnItemSelectedListener.onItemSelected (), так как он не будет вызван, если старый выбор и новый выбор окажутся в одной и той же позиции, и Spinner.getSelectedItemPosition (), поскольку он может фактически возвращать позиции, превышающие числоэлементов в ArrayAdapter, если вы удаляете элементы на лету.
У меня есть система из трех каскадных спиннеров, которые, в свою очередь, могут управлять содержимым других кнопок и текстов.Мне удалось получить 95% решений, пока я не осознал вышесказанное и не изменил свое мнение о том, что было авторитетным, а что нет - благодаря подчинению Spinner логике, которая определяет контент, а не наоборот.Поэтому вместо вызова setSelection () и использования обратного вызова onItemSelected () выполните всю каскадную логику вне обработчика и только затем вызовите setSelection () и вернитесь обратно по цепочке.
Адаптировано из моего рабочего кода:
class Spinster extends Activity {
...
private void setSpinnerOne( int pos ) {
// 1. Do our own chores, etc
doSomeStuff();
mSomeText.setText( "Blah!" );
mSomeButton.setEnabled( some_condition );
// 2. Populate dependent Spinner based on pos
populateSpinnerTwoAdapter( pos );
// 3. Cascade by calling SpinnerTwo logic (not the Spinner itself)
lSpinnerTwoPos = someNiceFunction();
setSpinnerTwo( lSpinnerTwoPos );
// 4. Now set SpinnerOne
mSpinnerTwo.setSelection( pos );
}
private void setSpinnerTwo( int pos ) {
// Follows the same pattern as setSpinnerOne(), but cascades to SpinnerThree
}
private void setSpinnerThree( int pos ) {
// Follows the same pattern as setSpinnerOne(), but need not cascade
}
...
private OnItemSelectedListener item_select = new OnItemSelectedListener() {
public void onItemSelected( AdapterView parent, View v, int position, long id )
{
...
int lId = parent.getId();
if ( lId == R.id.spinner_one ) {
setSpinnerOne( position );
} else if ( lId == R.id.spinner_two ) {
setSpinnerTwo( position );
} else if ( lId == R.id.spinner_three ) {
setSpinnerThree( position );
}
}
}
}
Здесь я упустил небольшую деталь, касающуюся установки и очистки защитной переменной в методах setSpinner * (), чтобы они не удосужились выполнить всю свою работу снова, когда onSelectedItemListener () перезванивает им.Я думаю, что базовую логику легче показать, если ее опустить.(И они не строго должны быть там - onItemSelected () не будет вызываться во второй раз.)
Я мог бы опубликовать реальный, рабочий пример, если это считаетсяаннотация.