Ich habe eine einfache ListActivity, die einen benutzerdefinierten ListAdapter verwendet, um die Ansichten in der Liste zu generieren. Normalerweise füllt der ListAdapter die Ansichten nur mit TextViews, aber jetzt möchte ich dort auch eine Schaltfläche einfügen.
Nach meinem Verständnis und meiner Erfahrung verhindert das Einfügen einer fokussierbaren Ansicht in das Listenelement das Auslösen von onListItemClick () in der ListActivity, wenn auf das Listenelement geklickt wird. Die Schaltfläche funktioniert weiterhin normal innerhalb des Listenelements, aber wenn etwas anderes als die Schaltfläche gedrückt wird, soll onListItemClick ausgelöst werden.
Wie kann ich das zum Laufen bringen?
android
android-widget
android-listview
CodeFusionMobile
quelle
quelle
Antworten:
Wie ich in früheren Kommentaren geschrieben habe, besteht die Lösung darin, auf ImageButtonFocusable (false) zu setzen.
Es gibt noch elegantere Lösungen, die versuchen, das
android:descendantFocusability="blocksDescendants"
Stammlayout des Listenelements hinzuzufügen . Das macht Klicks auf ListItem möglich und separat können Sie Button- oder ImageButton-Klicks verarbeitenIch hoffe es hilft ;)
Prost
quelle
android:descendantFocusability="blocksDescendants"
war perfekt.Ich hoffe ich kann hier helfen. Ich gehe davon aus, dass Sie ein benutzerdefiniertes Layout für listView-Elemente haben und dieses Layout aus Schaltflächen und einigen anderen Ansichten besteht - wie TextView, ImageView oder was auch immer. Jetzt möchten Sie, dass beim Klicken auf die Schaltfläche ein anderes Ereignis und bei allen anderen Klicks ein anderes Ereignis ausgelöst wird.
Sie können dies erreichen, ohne onListItemClick () Ihrer ListActivity zu verwenden.
Folgendes müssen Sie tun:
Sie verwenden ein benutzerdefiniertes Layout, daher überschreiben Sie wahrscheinlich die getView () -Methode Ihres benutzerdefinierten Adapters. Der Trick besteht darin, die verschiedenen Listener für Ihre Schaltfläche und für die gesamte Ansicht (Ihre Zeile) unterschiedlich einzustellen. Schauen Sie sich das Beispiel an:
Ihre OnItemClickListener-Klasse könnte wie folgt deklariert werden:
Natürlich werden Sie dem OnItemClickListener-Konstruktor wahrscheinlich weitere Parameter hinzufügen.
Und eine wichtige Sache - die oben gezeigte Implementierung von getView ist ziemlich hässlich. Normalerweise sollten Sie das ViewHolder-Muster verwenden, um findViewById-Aufrufe zu vermeiden. Aber das wissen Sie wahrscheinlich bereits.
Meine custom_row.xml-Datei ist RelativeLayout mit Button der ID "button", TextView der ID "text" und ImageView der ID "image" - nur um die Dinge klarer zu machen.
Grüße!
quelle
Wenn eine benutzerdefinierte ListView fokussierbare Elemente enthält, funktioniert onListItemClick nicht (ich denke, es ist das erwartete Verhalten). Entfernen Sie einfach den Fokus aus der benutzerdefinierten Ansicht, es wird den Trick tun:
Beispielsweise:
quelle
Ich habe das gleiche Problem: OnListItemClick nicht ausgelöst! [Gelöst] Dies
geschieht in Klassen, die ListActivity erweitern,
mit einem Layout für ListActivity, in dem TextBox und ListView in LinearLayout verschachtelt sind,
und einem anderen Layout für die Zeilen (CheckBox und TextBox, die in LineraLayout verschachtelt sind).
Das ist Code:
res / layout / configpage.xml (Haupt für ListActivity)
src /.../.../ ConfigPage.java
Dies beginnt zu funktionieren, wenn ich row.xml hinzufüge
android:focusable="false"
android:focusableInTouchMode="false"
Ich benutze Eclipse 3.5.2
Android SDK 10.0.1
min SDK Version: 3
Ich hoffe das ist hilfreich
... und entschuldige mein Englisch :(
quelle
Fügen Sie einfach
android:focusable="false"
als eines der Attribute Ihrer Schaltfläche hinzuquelle
Ich hatte das gleiche Problem mit ToggleButton. Nachdem ich einen halben Tag lang meinen Kopf gegen eine Wand geschlagen hatte, löste ich es endlich. Es ist so einfach wie das Fokussieren der fokussierbaren Ansicht mit 'android: focusable'. Sie sollten auch vermeiden, mit der Fokussierbarkeit und Klickbarkeit (ich habe gerade Wörter erfunden) der Listenzeile zu spielen. Lassen Sie sie einfach mit dem Standardwert.
Jetzt, da Ihre fokussierbaren Ansichten in der Listenzeile nicht mehr fokussierbar sind, können Benutzer, die die Tastatur verwenden, Probleme haben, sie zu fokussieren. Es ist wahrscheinlich kein Problem, aber nur für den Fall, dass Sie 100% fehlerfreie Apps schreiben möchten, können Sie das Ereignis onItemSelected verwenden, um die Elemente der ausgewählten Zeile fokussierbar und die Elemente der zuvor ausgewählten Zeile nicht fokussierbar zu machen.
quelle
quelle
Ich habe getListAdapter (). GetItem (position) verwendet, um ein Objekt zu instanziieren, das meine Werte innerhalb des Elements enthält
Verwenden Sie dann die Getter-Methode aus dem myPojo, um die richtigen Werte innerhalb des Elements aufzurufen.
quelle