2011-01-29 11 views
17

w moim Android app Stworzyłem element ListView nazwie myList, i napełnił ją obiektów własnego typu niestandardowe:Jak uzyskać wybrany przedmiot z ListView?

class MyClass{ 

    private String displayName; 
    private String theValue; 
... //here constructor, getters, setters and toString() are implemented 

} 

użyłem ArrayAdapter do związanego ArrayList theObjects z myList:

ArrayAdapter<MyClass> adapter= 
       new ArrayAdapter<MyClass>(this, R.layout.lay_item, theObjects); 
myList.setAdapter(adapter); 

Działa to dobrze, lista jest zapełniona itp., Ale kiedy próbuję uzyskać dostęp do wybranego elementu, otrzymuję obiekt zerowy. Zrobiłem to, używając

Co wydaje się być problemem? Dziękujemy

Odpowiedz

-2

MyClass selItem = (MyClass) myList.getSelectedItem(); //

Nigdy nie tworzyłeś swojej klasy.

+3

Powiedział, że mogę zobacz rzeczy, więc klasa musi mieć instancję. – xandy

19

Implementujesz moduł obsługi kliknięć zamiast obsługi wyboru. Lista domyślnie nie powinna mieć wyboru.

Co należy zmienić, w powyższym przykładzie, jest

public void onItemClick(AdapterView<?> adapter, View v, int position, long id) { 
    MyClass item = (MyClass) adapter.getItem(position); 
} 
34

Domyślnie, po kliknięciu na elemencie ListView nie zmienia swój stan na „wybrany”. Tak więc, gdy zdarzenie się odpala i robisz:

myList.getSelectedItem(); 

Ta metoda nie ma nic do zwrócenia. Co trzeba zrobić, to wykorzystać pozycję i uzyskać podstawowy przedmiot wykonując:

myList.getItemAtPosition(position); 
+1

Jak to pomaga w znalezieniu indeksu wybranego elementu?Jak dostaniesz pozycję na pierwszym miejscu? – Zelphir

+0

@Zelphir Pozycja jest przekazywana do adaptera onItemClick (AdapterView , View v, int position, long id) – RustyFluff

+0

Świetna odpowiedź, powinna być zaakceptowana – Michael

3
myList.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> adapter, View v, int position, long id) { 
     MyClass selItem = (MyClass) adapter.getItem(position); 
    } 
} 
5

Na onItemClick:

String text = parent.getItemAtPosition(position).toString(); 
1

W touch mode, nie ma ostrości i brak wyboru . Twój interfejs użytkownika powinien używać innego typu widżetu, na przykład przycisków radiowych, do wyboru.

Dokumentacja ListView na ten temat jest okropna, tylko jedna niejasna wzmianka na temat setSelection.

4

Ponieważ onItemClickLitener() sam dostarczy indeks wybranego elementu, można po prostu zrobić getItemAtPosition(i).toString(). Fragment kodu jest podana poniżej: -

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

      String s = listView.getItemAtPosition(i).toString(); 

      Toast.makeText(activity.getApplicationContext(), s, Toast.LENGTH_LONG).show(); 
      adapter.dismiss(); // If you want to close the adapter 
     } 
    }); 

Na powyższą metodą, parametr i faktycznie daje pozycję wybranego elementu.

1

Korzystanie setOnItemClickListener jest poprawna odpowiedź, ale jeśli masz klawiaturę można zmienić wybór nawet ze strzałkami (bez kliknięcia wykonywane), więc trzeba zaimplementować również setOnItemSelectedListener:

myListView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) { 
    MyObject tmp=(MyObject) adapterView.getItemAtPosition(position); 
     } 
      @Override 
      public void onNothingSelected(AdapterView<?> adapterView) { 
       // your stuff 
      } 
     }); 
Powiązane problemy