Android ListView-Kind Zeigen Sie setEnabled () und setClickable () nichts an

8

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.

%Vor%

Meine Ansicht für jede Zeile ist eine benutzerdefinierte LinearLayout mit zwei TextView s.

    
Axarydax 08.01.2011, 21:32
quelle

4 Antworten

20

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:

%Vor%     
Cristian 08.01.2011, 22:32
quelle
18

Wenn Sie den Gegenstand deaktivieren möchten, klicken Sie in der Listenansicht auf clickedView.setClickable(true);

    
user622689 12.05.2011 14:35
quelle
5

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.

    
CommonsWare 08.01.2011 22:30
quelle
4

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.

    
Qberticus 08.01.2011 23:13
quelle

Tags und Links