Activity
Klassencode:
conversationList = (ListView)findViewById(android.R.id.list);
ConversationArrayAdapter conversationArrayAdapter=new ConversationArrayAdapter(this, R.layout.conversation_list_item_format_left, conversationDetails);
conversationList.setAdapter(conversationArrayAdapter);
conversationList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
Log.d("test","clicked");
}
});
Die getView
Funktion in der Adapter
Klasse:
if (v == null) {
LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(leftSideMessageNumber.equals(m.getTo())) {
v = vi.inflate(R.layout.conversation_list_item_format_left, null);
} else {
v = vi.inflate(R.layout.conversation_list_item_format_right, null);
}
}
Gibt es ein Problem mit der Verwendung von zwei xml beim Aufblasen?
Antworten:
Ich habe gerade eine Lösung von hier gefunden, aber durch tiefes Klicken.
Wenn ein Zeilenelement der Liste eine fokussierbare oder anklickbare Ansicht enthält, funktioniert dies
OnItemClickListener
nicht.Das Zeilenelement muss einen Parameter wie haben
android:descendantFocusability = "blocksDescendants"
.Hier sehen Sie ein Beispiel, wie Ihr Listenelement aussehen sollte. Ihr Listenelement xml sollte ...
row_item.xml
(your_xml_file.xml
)quelle
listView.setDescendantFocusability(int focus);
denenfocus
eines vonViewGroup.FOCUS_BEFORE_DESCENDANTS
,ViewGroup.FOCUS_AFTER_DESCENDANTS
oderViewGroup.FOCUS_BLOCK_DESCENDANTS
Das Problem ist, dass Ihre Layouts entweder fokussierbare oder anklickbare Elemente enthalten. Wenn eine Ansicht entweder ein fokussierbares oder ein anklickbares Element enthält, wird der OnItemCLickListener nicht aufgerufen.
Klicken Sie hier für weitere Informationen.
Bitte poste eine deiner Layout-XMLs, wenn dies nicht der Fall ist.
quelle
EditText
s inTextView
s geändert und dasCheckBox
durfte bleiben (und umschaltbar bleiben) mitandroid:descendantFocusability="blocksDescendants"
zu meinem hinzugefügtLinearLayout
.android:focusableInTouchMode="true"
für die Reihe, sobald es entfernt wurde, fing es endlich an zu funktionieren! :-)Für meine Listen haben meine Zeilen andere Dinge, auf die geklickt werden kann, wie z. B. Schaltflächen, sodass das Ausführen einer Decke
blocksDescendants
nicht funktioniert. Stattdessen habe ich eine Zeile in die XML-Datei der Schaltfläche eingefügt:Dadurch wird verhindert, dass die Schaltflächen die Klicks auf die Zeilen blockieren, die Schaltflächen können jedoch weiterhin die Klicks ausführen.
quelle
Sie müssen 2 Schritte in Ihrer listview_item.xml ausführen
android:descendantFocusability="blocksDescendants"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
Hier ist ein Beispiel: listview_item.xml
quelle
clickable="true
in der Elementansicht wird dasonItemClick
nicht aufgerufen.clickable="false"
LinearLayout
Verwenden Sie den folgenden Code im Schaltflächen-Tag im benutzerdefinierten Zeilenlayout der Listenansicht
quelle
android:descendantFocusability="blocksDescendants"
, diese Kontrollkästchen für Klick zu blockierenIch hatte das gleiche Problem und sah nur, dass ich versehentlich eingestellt hatte:
in meiner CustomListViewAdapter-Klasse.
Indem Sie dies ändern in:
Ich habe es geschafft, das Problem zu beheben. Nur für den Fall, dass jemand den gleichen Fehler gemacht hat ...
quelle
@Override public void onApplicationStart { ExplodeThisDevice(); }
Verwenden Sie android: descantFocusability
Fügen Sie oben im Root-Layout hinzu
quelle
Ich habe es mit Hilfe dieser Antwort gelöst
1. Fügen Sie im linearen Layout von list_items.xml Folgendes hinzu
android:descendantFocusability="blocksDescendants"
2.Kindansichten von LinearLayout in list_items.xml
quelle
Wenn Sie Textansichten, Schaltflächen oder stg nur in Ihrer Zeilenansicht anklickbar oder auswählbar haben
ist nicht genug. Du musst einstellen
zu Ihren Textansichten und
zu Ihren Schaltflächen und anderen fokussierbaren Elementen.
quelle
Sogar ich hatte das gleiche Problem, ich habe ein Kontrollkästchen, habe die folgenden Schritte ausgeführt, um itemClickListener zu maskieren:
Dem Kontrollkästchen wurden die folgenden Eigenschaften hinzugefügt:
und ItemClickListner begannen zu arbeiten.
Für ein detailliertes Beispiel können Sie über den Link gehen,
http://knowledge-cess.com/android-itemclicklistner-with-checkbox-or-radiobutton/
Hoffe es hilft Prost !!
quelle
Ich hatte das gleiche Problem und versuchte alle genannten Lösungen ohne Erfolg. Durch Tests stellte ich fest, dass das Auswählen des Textes das Aufrufen des Listeners verhinderte. Durch Umschalten auf false oder Entfernen wurde mein Listener erneut aufgerufen.
hoffe, das hilft jemandem, der wie ich feststeckte.
quelle
Fügen Sie dies im Hauptlayout hinzu
Schreiben Sie diesen Code in jede Schaltfläche, Textansicht, Bildansicht usw., die onClick haben
Hoffe es wird funktionieren.
quelle
Zwei großartige Lösungen waren: Wenn Sie ListFragment aus einem Fragment erweitern und wissen, dass
mListView.setOnItemClickListener
es nicht aufgerufen wird, bevor Ihre Aktivität erstellt wird, wird sichergestellt, dass es festgelegt wird, wenn die Aktivität erstellt wurdeBeim Betrachten des Quellcodes für ListFragment bin ich darauf gestoßen
Ein
onItemClickListener
Objekt wird angehängt undonListItemClick()
als solches aufgerufen. Die andere ähnliche Lösung, die genauso funktioniert, besteht darin, sie zu überschreibenonListItemClick()
quelle
In meinem Fall war keine der XML-Layout-Eigenschaften nicht hilfreich.
Ich füge nur eine einzelne Codezeile wie folgt hinzu : convertView.setClickable (false);
Im Grunde macht es dasselbe wie das Einrichten von Eigenschaften im XML-Layout, aber es war nur das, was in meinem Fall funktioniert.
Es ist kein perfektes Timing, aber vielleicht hilft es jemandem. Happy Coding
quelle
Ich habe alles oben versucht und NICHTS hat funktioniert.
Ich habe das Problem wie folgt gelöst:
Zuerst definiere ich einen benutzerdefinierten Button namens
ListButton
Das XML sieht aus wie:
Dann definiere ich meine eigene
ButtonClicked
Listener-Oberfläche:Dann benutze ich meinen eigenen Hörer, als wäre es normal
OnClickListener
:quelle
Ich hatte das gleiche Problem, ich verwendete einen Stil für meine Texte im Zeilenlayout, der das Attribut "fokussierbar" hatte. Es hat funktioniert, nachdem ich es entfernt habe.
quelle
In meinem Fall musste ich die nächste Zeile aus dem entfernen
Layout
quelle
Android: Das autoText-Attribut macht TextView auch automatisch fokussierbar.
quelle
Wenn Sie sowohl den einfachen Klick als auch den langen Klick auf Listenansichtselemente verwenden möchten, können Sie dies besser implementieren, indem Sie das Kontextmenü für den langen Klick verwenden. Vermeiden Sie die Verwendung von setItemLongClickListener, insbesondere wenn Sie mehrere Zeilenlayouts für Ihre Listenansicht haben.
quelle
Konfrontiert das gleiche Problem, stundenlang versucht. Wenn Sie alle oben genannten Schritte ausgeführt haben, ändern Sie die layout_width von Listview und das Listenelement von wrap_content in match_parent.
quelle
All das ist für mich gescheitert. Ich konnte das Problem jedoch beheben (nach vielen Stunden Kopfschlag - Google, wenn Sie zuhören, sollten Sie in Betracht ziehen, das, was ich unten festgestellt habe, wenn möglich in Form von Compilerfehlern zu beheben).
Sie müssen wirklich vorsichtig sein, welche Android-Attribute Sie Ihrem XML-Layout hier hinzufügen (in dieser ursprünglichen Frage heißt es list_items.xml). Für mich war das Problem, dass ich von einer EditText-Ansicht zu einer TextView gewechselt war und das Attribut cruft aus der Änderung übrig hatte (in meinem Fall inputType). Der Compiler hat es nicht abgefangen und die Klickbarkeit ist einfach fehlgeschlagen, als ich die App ausgeführt habe. Überprüfen Sie alle Attribute, die Sie in Ihren Layout-XML-Knoten haben.
quelle
Verwenden Sie dann in Ihrer Aktivität adapter.setOnItemClickListener (), bevor Sie es an die Listenansicht anhängen.
Von Github kopiert, hat es für mich funktioniert
quelle
Für mich hat es funktioniert, jeder Unteransicht im Layout meiner Datei row.xml den folgenden Code hinzuzufügen:
Also in meinem Fall:
Und dies ist mein setOnItemClickListener-Aufruf in meiner Fragment-Unterklasse:
Ich habe die Antwort von hier !
quelle
Ich habe das Problem gelöst, indem ich die anklickbaren Ansichten aus der Liste entfernt habe.
quelle