2011-05-11 1 views
5

Я пытаюсь использовать элемент управления прядильщика, который позволит пользователю удалить любой элемент списка. У меня есть кнопка «добавить», чтобы добавить элементы в список, и кнопку «удалить», которая удаляет отображаемый в данный момент элемент из списка.Удаление последнего элемента из spinner удаляет весь список

Работает как ожидается кроме, когда пользователь удаляет последний элемент в списке. В этот момент все элементы списка удаляются.

Мой код выглядит следующим образом:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

    // grab our UI elements so we can manipulate them (for the Spinner) 
    // or add listeners to them (in the case of the buttons) 
    m_myDynamicSpinner = (Spinner)findViewById(R.id.dynamicSpinner); 
    m_addItemText = (EditText)findViewById(R.id.newSpinnerItemText); 
    Button addButton = (Button)findViewById(R.id.AddBtn); 
    Button clearButton = (Button)findViewById(R.id.ClearBtn); 

    // create an arrayAdapter an assign it to the spinner 
    m_adapterForSpinner = new ArrayAdapter(this, android.R.layout.simple_spinner_item); 
     ((ArrayAdapter)m_adapterForSpinner).setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    m_myDynamicSpinner.setAdapter(m_adapterForSpinner); 

    // add listener for addButton 
    addButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      addNewSpinnerItem(); 
     } 
    }); 

    clearButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      clearSpinnerItems(); 
     } 
    }); 
} 

// add listener for addButton 
private void addNewSpinnerItem() { 
    if (m_addItemText.getText().length() == 0) { 
     Toast.makeText(getApplicationContext(), "The textView is empty", Toast.LENGTH_LONG).show(); 
    } else { 
     CharSequence textHolder = "" + m_addItemText.getText(); 
     ((ArrayAdapter) m_adapterForSpinner).add(textHolder); 
    } 
    m_addItemText.setText(""); 
} 

private void clearSpinnerItems() { 
    m_myDynamicSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
      Object t = m_adapterForSpinner.getItem(pos); 
      ((ArrayAdapter) m_adapterForSpinner).remove((CharSequence) t); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // TODO 
     } 
    }); 
} 

Кто-нибудь есть какие-либо идеи или предложения о том, как сделать эту работу?

+0

У вас есть setSingleChoiceItems или setMultiChoiceItems в блесны, и вы можете плз предоставить некоторый код, чтобы мы могли помочь вам в лучшую сторону –

+0

, что ответ? вы попадаете в Log.v («Item removed», t + «»); ? –

+0

с использованием Log.v («Элемент удален», t + ""); Я получаю выбранный элемент, но я не могу удалить выбранный элемент. – Hisenberg

ответ

1

Я не могу понять ваш вопрос. Любой способ получить позицию выбранного элемента можно с помощью метода getSelectedItemPosition().

+1

см сегмент кода и скажите мне Ваты м делают неправильно – Shruti

+0

м с помощью android.R.layout.simple_spinner_dropdown_item – Shruti

+0

и android.R.layout.simple_spinner_item – Shruti

4

Проблема с кодом заключается в том, что удаление находится внутри обратного вызова 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 
+1

это правильно, после удаления предмета Spinner выбирает новый и вызывает себя до тех пор, пока ничего не останется. Xou shoud не зарегистрировать onitemselect Listener, но выберите элемент, который вы хотите удалить, и удалите его, нажав кнопку – 2red13

+0

@ 2red13, да, это то, что я бы сделал, но я предполагаю, что это тестовый пример для кода, который я не видел , поэтому я даю решение, которое наименее изменяет структуру. На самом деле этот подход имеет вторую проблему: вы не можете удалить параметр, который уже выбран (так как он не срабатывает onItemSelected). – Aleadam

+0

да :) Я получил ур код работал для меня спасибо :) – Hisenberg

Смежные вопросы