Ich mache etwas AsyncTask
Arbeit, nachdem der Benutzer auf ein Element in meinem ListView
geklickt hat. Ich möchte das Element deaktivieren, sodass es nicht zweimal geklickt werden kann. Ich habe den Klick-Listener so vereinfacht, dass er nur diese Methode enthält, aber für mich macht er immer noch nichts, die Ansicht sieht genauso aus und lässt sich glücklicherweise erneut anklicken, sehr zu meinem Ärger.
Meine Ansicht für jede Zeile ist eine benutzerdefinierte LinearLayout
mit zwei TextView
s.
Sie können also auch einen benutzerdefinierten Adapter verwenden. Wenn Sie dies tun, überschreiben Sie diese Methoden:
%Vor% Wenn Sie dann einen Klick erhalten, teilen Sie dem Adapter mit, was das letzte angeklickte Objekt war, und geben Sie für isEnabled
für diese Position false zurück. Zum Beispiel können Sie eine Methode wie diese in Ihrem Adapter haben:
Wenn Sie den Gegenstand deaktivieren möchten, klicken Sie in der Listenansicht auf clickedView.setClickable(true);
Dein Problem ist nicht ganz klar. Ich interpretiere Ihre Frage so, dass Sie erwarten, dass onItemClick()
nicht auf Basis Ihrer Aufrufe setEnabled()
und setClickable()
aufgerufen wird.
Ich bin nicht überrascht, dass das nicht funktioniert, da onItemClick()
etwas ListView
tut, nicht die untergeordnete Ansicht. Versuchen Sie stattdessen areAllItemsEnabled()
und isEnabled()
in Ihrem ListAdapter
zu überschreiben.
Es gibt mehrere Gründe, warum Ihr Ansatz nicht funktioniert.
1) onItemClick
wird nur aufgrund von Tastaturereignissen aufgerufen. Speziell KeyKevent.KEYCODE_ENTER
. Es wird nicht über einen anderen Codepfad aufgerufen. Daher ist die Handhabung sogar nur dann nützlich, wenn Sie versuchen, Keyboard / Trackball-Unterstützung bereitzustellen.
Android-Quellcode für AbsListView relevante Methoden:
%Vor% 2) Sie setzen die anklickbaren Informationen direkt auf die Ansicht. Die über AdapterView
angezeigten Ansichten sind ätherisch. Sie werden auf Anfrage von AdapterView
erstellt und existieren nur, solange% code_% sie benötigt. Sie sollten keine Daten über sie festlegen, die Sie behalten möchten. Sie können AdapterView
und setEnabled
für sofortige Wirkung aufrufen, aber wenn Sie möchten, dass diese Information erhalten bleibt, müssen Sie sie irgendwo speichern, auf die setClickable
Zugriff hat, damit sie neu erstellt werden kann, wenn Adapter
die% co_de neu erstellt % für diese Position.
3) Sie müssen das AdapterView
-Ereignis für den tatsächlich angeklickten View
verarbeiten. Wo du damit umgehst, liegt ganz bei dir. Der beste Platz ist wahrscheinlich Ihre onClick
, die dann je nach Ihren Designanforderungen an Ihre View
weitergegeben wird oder nicht. Dort müssen Sie Ihre Berührungsereignisse verarbeiten.
Siehe diesen Code für eine einfache Aktivität:
%Vor% Wenn Sie diesen Code ausführen und auf eines der Adapter
s in Activity
klicken, werden Sie in der logcat-Ausgabe feststellen, dass nur View
aufgerufen wird. ListView
wird nie aufgerufen.
Beachten Sie auch, dass onClick
im Adapter anscheinend nicht wirkt, wenn onItemClick
anklickbar ist oder nicht. Ich bin mir nicht sicher, wie ich das interpretieren soll. Das bedeutet aber, dass wenn Sie diese Eigenschaft von isEnabled
kontrollieren wollen, die View
benötigt, wenn% code_% erstellt wird, und diese Informationen irgendwie zu pflegen.