Mam ListView
gdzie każdy element na liście zawiera TextView i dwa różne przyciski. Coś takiego:
ListView
--------------------
[Text]
[Button 1][Button 2]
--------------------
[Text]
[Button 1][Button 2]
--------------------
... (and so on) ...
Za pomocą tego kodu mogę utworzyć OnItemClickListener
dla całego elementu:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> list, View view, int position, long id) {
Log.i(TAG, "onListItemClick: " + position);
}
}
});
Nie chcę jednak, aby można było klikać cały element, ale tylko dwa przyciski każdego elementu listy.
Więc moje pytanie brzmi: jak zaimplementować onClickListener dla tych dwóch przycisków z następującymi parametrami:
int button
(który przycisk elementu został kliknięty)int position
(który jest elementem na liście, na którym nastąpiło kliknięcie przycisku)
Aktualizacja: Znalazłem rozwiązanie opisane w mojej odpowiedzi poniżej. Teraz mogę kliknąć / dotknąć przycisku za pomocą ekranu dotykowego. Nie mogę jednak ręcznie wybrać go za pomocą trackballa. Zawsze zaznacza cały element listy i stamtąd przechodzi bezpośrednio do następnego elementu listy, ignorując przyciski, mimo że ustawiłem .setFocusable(true)
i setClickable(true)
dla przycisków w getView()
.
Dodałem również ten kod do mojego niestandardowego adaptera listy:
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return false;
}
To powoduje, że żaden element listy nie jest już do wyboru. Ale nie pomogło to w wybraniu zagnieżdżonych przycisków.
Czy ktoś ma pomysł?
Odpowiedzi:
Rozwiązanie tego jest w rzeczywistości łatwiejsze niż myślałem. Możesz po prostu dodać do
getView()
metody niestandardowego adaptera setOnClickListener () dla używanych przycisków.Wszelkie dane związane z przyciskiem należy dodać
myButton.setTag()
wgetView()
i można uzyskać do niego dostęp za pośrednictwem onClickListenerview.getTag()
Szczegółowe poradnik zamieściłem na blogu .
źródło
To jest odpowiedź na dodatek @ znq ...
Istnieje wiele przypadków, w których chcesz poznać pozycję wiersza dla klikniętego elementu ORAZ chcesz wiedzieć, który widok w wierszu został dotknięty. Będzie to o wiele ważniejsze w interfejsach tabletów.
Możesz to zrobić za pomocą następującego niestandardowego adaptera:
źródło
Dla przyszłych czytelników:
Aby ręcznie wybrać przyciski za pomocą trackballa, użyj:
I aby wyłączyć fokus na całej pozycji listy:
Działa to dla mnie dobrze, mogę klikać przyciski z ekranem dotykowym, a także umożliwia skupienie kliknięcia za pomocą klawiatury
źródło
Nie mam dużego doświadczenia niż powyżsi użytkownicy, ale napotkałem ten sam problem i rozwiązałem go poniżej
btnRemoveClick Zdarzenie Click
źródło
Prawdopodobnie wiesz, jak to zrobić, ale możesz zadzwonić
a teraz twoje przyciski będą się skupiać
źródło
Nie jestem pewien, czy to najlepszy sposób, ale działa dobrze i cały kod pozostaje w ArrayAdapter.
źródło
Wiem, że jest późno, ale to może pomóc, to przykład, w jaki sposób piszę niestandardową klasę adaptera dla różnych akcji kliknięcia
źródło
Czy rozwiązanie platformy dla tej implementacji nie korzysta z menu kontekstowego wyświetlanego po długim naciśnięciu?
Czy autor pytania zna menu kontekstowe? Układanie przycisków w widoku listy ma wpływ na wydajność, zaśmieca interfejs użytkownika i narusza zalecany projekt interfejsu dla platformy.
Z drugiej strony; menu kontekstowe - z natury nie posiadające pasywnej reprezentacji - nie są oczywiste dla użytkownika końcowego. Zastanów się nad udokumentowaniem zachowania?
Ten przewodnik powinien dać dobry początek.
http://www.mikeplate.com/2010/01/21/show-a-context-menu-for-long-clicks-in-an-android-listview/
źródło