2012-08-24 22 views
14

mam tarczy, która zapełnia z bazy danych:ustawić onClickListener dla przedmiotu obrotowego?

catSpinner = (Spinner) findViewById(R.id.spinner1); 
cursor = dataAdapter.getAllCategory(); 
startManagingCursor(cursor); 
String[] from = new String[] { DataAdapter.CATEGORY_COL_NAME }; 
int[] to = new int[] { android.R.id.text1 }; 
SimpleCursorAdapter catAdapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_spinner_dropdown_item, cursor, from,to, 0); 
catAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
catAdapter.notifyDataSetChanged(); 
catSpinner.setAdapter(catAdapter); 

I chcę zadzwonić AlertDialog kiedy wybrać ostatnią pozycję (Add new category...).
Po dodaniu nowej kategorii chcę, aby "element (Add new category...)" był ponownie ostatni.
Jak mogę to zrobić?

Odpowiedz

49

You NIE POWINIEN zadzwonić pod numer OnItemClickListener za spinner. Spinner nie obsługuje zdarzeń kliknięć elementów. Wywołanie tej metody spowoduje wyjątek. Sprawdź this. Możesz zamiast tego zastosować numer OnItemSelectedListener.

Edit:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() 
    { 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
     { 
      String selectedItem = parent.getItemAtPosition(position).toString(); 
      if(selectedItem.equals("Add new category")) 
      { 
       // do your stuff 
      } 
     } // to close the onItemSelected 
     public void onNothingSelected(AdapterView<?> parent) 
     { 

     }   
    }); 

miarę dodawania „Dodaj nową kategorię” na końcu listy jest zaniepokojony, myślę, że należy lepiej pójść do własnego zasilacza, w którym po dodaniu wszystkich przedmiotów, możesz dodać tę stałą (Dodaj nową kategorię) do końca tablicy, aby była zawsze ostatnia.

+0

wiem to. Ale w jaki sposób mogę obsłużyć w "OnItemSelectedListener" wybrany tylko jeden element? –

+1

po wybraniu dowolnego elementu otrzymasz wybrany element. Porównaj ten wybrany element ze swoim predefiniowanym elementem, ponieważ jest stały. Jeśli wybraną pozycją jest ta predefiniowana pozycja, wykonaj swoje zadanie – Braj

+0

To nie działa. Myślę, że ponieważ to 'parent.getItemAtPosition (position) .toString();' zwraca pozycję i konwertuje ją na łańcuch. –

5

Hak do OnItemClickListener z Spinner. Następnie sprawdź, czy wybrana pozycja to "Dodaj nową kategorię".

Jeśli tak, wyświetl okno dialogowe, aby dodać nowy element.

Podczas dodawania nowego elementu,

  1. Usuń ostatnią pozycję „Dodaj nową kategorię”.
  2. Dodaj nową kategorię wpisaną.
  3. Następnie ponownie dodaj pozycję "Dodaj nową kategorię".

Spowoduje to dodanie elementu "Dodaj nową kategorię" jako ostatniego.

Przykładowy kod:

układ main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:weightSum="10" > 

<Spinner 
    android:id="@+id/cmbNames" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

</LinearLayout> 

układ spinner_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/tvName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

</LinearLayout> 

Klasa aktywności:

public class MainActivity extends Activity { 

private static final String NAME = "name"; 
private static final String ADD_NEW_ITEM = "Add New Item"; 

private SimpleAdapter adapter; 
private Spinner cmbNames; 
private List<HashMap<String, String>> lstNames; 
private int counter; 

private OnItemSelectedListener itemSelectedListener = new OnItemSelectedListener() { 

    @Override 
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, 
      long arg3) { 
     HashMap<String, String> map = lstNames.get(arg2); 
     String name = map.get(NAME); 
     if (name.equalsIgnoreCase(ADD_NEW_ITEM)) { 
      lstNames.remove(map); 
      counter++; 
      addNewName(String.valueOf(counter)); 
      addNewName(ADD_NEW_ITEM); 
      adapter.notifyDataSetChanged(); 
     } 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> arg0) { 
     // TODO Auto-generated method stub 

    } 
}; 

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

    populateList(); 

    cmbNames = (Spinner) findViewById(R.id.cmbNames); 
    adapter = new SimpleAdapter(this, lstNames, R.layout.spinner_item, 
      new String[] { NAME }, new int[] { R.id.tvName }); 
    cmbNames.setAdapter(adapter); 
    cmbNames.setOnItemSelectedListener(itemSelectedListener); 
} 

private void populateList() { 
    lstNames = new ArrayList<HashMap<String, String>>(); 

    addNewName("abc"); 
    addNewName("pqr"); 
    addNewName("xyz"); 
    addNewName(ADD_NEW_ITEM); 
} 

private void addNewName(String name) { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map.put(NAME, name); 
    lstNames.add(map); 
} 

} 
+1

Zaktualizowałem wpis przy użyciu przykładowego kodu. Proszę sprawdzić. –

+0

a onitemclicklistener nie można podłączyć do spinnera – SoroushA