Проблема с вашим кодом состоит в том, что удаление находится внутри обратного вызова onItemSelected, который вызывается каждый раз, когда вы удаляете запись, таким образом, рекурсивное удаление, пока у вас фактически не останется больше записей для выбора.Если вы добавите журнал внутри этого метода:
Log.d("Spinner", "Count: " + m_adapterForSpinner.getCount());
, вы поймете, что я имею в виду.Я уверен, что вы можете придумать более элегантный код, но быстрый и грязный взлом состоит в том, чтобы установить логический флаг, чтобы остановить рекурсию после первого удаления.Посмотрите фрагмент ниже и добавьте закомментированные строки в свой собственный код:
public class SpinnerTest extends Activity {
Spinner m_myDynamicSpinner;
EditText m_addItemText;
ArrayAdapter m_adapterForSpinner;
public static boolean cleared = false; // <--- set up a static boolean here
@Override
public void onCreate(Bundle savedInstanceState) {
// all your code unchanged
clearButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
cleared=false; // <--- nope, we did not clear the value yet
clearSpinnerItems();
}
});
}
// code unchanged
private void clearSpinnerItems() {
m_myDynamicSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
Object t = m_adapterForSpinner.getItem(pos);
Log.d("Spinner", "Count: " + m_adapterForSpinner.getCount());
if (!cleared) // <--- did I do it already?
((ArrayAdapter) m_adapterForSpinner).remove((CharSequence) t);
Log.d("Spinner", "Count: " + m_adapterForSpinner.getCount());
cleared=true; // I did it!
}
// code unchanged