2011-05-11 7 views
5

Próbuję użyć pokrętła, które umożliwi użytkownikowi usunięcie dowolnego elementu listy. Mam przycisk "dodaj", aby dodać elementy do listy, oraz przycisk "usuń", który usuwa aktualnie wyświetlany element z listy.Usunięcie ostatniego elementu z pokrętła powoduje skasowanie całej listy.

Działa zgodnie z oczekiwaniami oprócz, gdy użytkownik usunie ostatni element z listy. W tym momencie wszystkie pozycje listy zostaną usunięte.

Mój kod wygląda następująco:

@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 
     } 
    }); 
} 

Czy ktoś ma jakieś pomysły lub sugestie na temat tej pracy?

+0

Czy masz setSingleChoiceItems lub setMultiChoiceItems w pokrętła i można plz zapewnić pewien kod, tak, że możemy pomóc w lepszy sposób –

+0

jaka reakcja? dostaniesz w Log.v ("Item removed", t + ""); ? –

+0

za pomocą Log.v ("Element usunięty", t + ""); otrzymuję wybrany element, ale nie mogę usunąć wybranego elementu. – Hisenberg

Odpowiedz

1

Nie mogę zrozumieć twojego pytania. W żaden sposób nie możesz uzyskać pozycji wybranego elementu za pomocą metody getSelectedItemPosition().

+1

zobacz segment kodu i powiedz mi wat robię źle – Shruti

+0

używam android.R.layout.simple_spinner_dropdown_item – Shruti

+0

i android.R.layout.simple_spinner_item – Shruti

4

Problem z kodem polega na tym, że usunięcie jest wewnątrz wywołania zwrotnego onItemSelected, które jest wywoływane za każdym razem, gdy usuwasz wpis, tym samym usuwając rekursywnie, dopóki skutecznie nie będziesz mieć więcej wpisów do wyboru. Jeśli dodasz dziennik do tej metody:

Log.d("Spinner", "Count: " + m_adapterForSpinner.getCount()); 

zobaczysz, co mam na myśli. Jestem pewien, że możesz wymyślić bardziej elegancki kod, ale szybki i brudny hack to ustawienie flagi boolowskiej, aby zatrzymać rekursję po pierwszym usunięciu. Zobacz poniżej fragment oraz dodać komentowanej linii do własnego kodu:

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

To prawda, po usunięciu przedmiotu Spinner wybiera nowy i sam się do niego odezwał, dopóki nie pozostanie żaden przedmiot. Xou shoud nie rejestrować onitemselect Listenera, ale wybierz element, który chcesz usunąć i usunąć go, klikając przycisk – 2red13

+0

@ 2red13 tak, to też bym zrobił, ale zakładam, że jest to przypadek testowy dla kodu, którego nie widziałem , więc podaję rozwiązanie, które najmniej zmienia strukturę. W rzeczywistości takie podejście ma drugi problem: nie można usunąć opcji, która jest już wybrana (ponieważ nie uruchamia on onItemSelected). – Aleadam

+0

tak :) mam go kod działa dla mnie dziękuję :) – Hisenberg

Powiązane problemy