Gibt es Nachteile bei der Implementierung von onClickListener für jede ListView-Zeile anstelle von onItemClickListener?

StackOverflow https://stackoverflow.com//questions/9708208

Frage

Für mich wäre es bequemer, ein Unikat zu registrieren OnClickListener für jede Zeile in der ListView, aber ich möchte sicher sein, dass dies eine akzeptable Praxis ist.Mein aktuelles Design ist eine ziemlich komplizierte Art, die Anliegen der zu trennen OnClickListener aus jedem Zeilentyp.

Der Grund dafür ist, dass ich mehrere Zeilenklassen im habe ListView.Jede Klasse hat eine völlig andere Verantwortung und ein anderes Verhalten.Betrachten Sie zum Beispiel a ListView das sowohl Unterkategorien als auch Buchtitel enthalten kann.Wenn auf einen Buchtitel geklickt wird, sollte eine neue Aktivität starten, die das Titelbild zeigt.Wenn auf eine Unterkategorie geklickt wird, wird eine neue Liste mit Büchern und Kategorien angezeigt.

Ich möchte, dass die Zeile selbst das Wissen über ihre eigene Identität und Verantwortung behält, anstatt das Wissen über jede Zeile preiszugeben, das vom Implementierer von verwaltet werden muss onItemClickListener.

Ich würde auch gerne wissen, welche Auswirkungen dies auf die Leistung hat.Implementieren meiner eigenen Logik, um herauszufinden, wie ich mit dem Klick umgehen soll.

Gibt es Nachteile bei der Implementierung? onClickListener für jede ListView ArrayAdapter Reihe statt onItemClickListener?Ich suche konkrete Daten Und spezifische Nachteile statt vager Empfehlungen.

Sollte ich damit rechnen Speichernutzung, Initialisierungszeit, oder stationäre Geschwindigkeit (wie das Scrollen durch die Liste) erheblich beeinträchtigt werden?

War es hilfreich?

Lösung

Sie erklären nicht, warum Sie für jede Zeile separate Klick-Listener benötigen würden, aber ich würde davon abraten.Werfen Sie einen Blick auf die Verwendung View.setTag(Object)/View.getTag() um zeilenspezifische benutzerdefinierte Daten zu übergeben, mit denen Sie die Reaktion eines (gemeinsam genutzten) Klick-Listeners anpassen können.

BEARBEITEN

An Ihrem Beispiel erkenne ich, warum Sie etwas anderes wollen OnClickListeners ist an Ihre Zeilen angehängt.Ich hatte den Eindruck, dass Sie eine separate wollten OnClickListener Instanz für jede Zeile.(Das war der Hauptgrund, warum ich davon abgeraten habe.) Wenn Sie zwei Arten von Zeilen (Kategorien und Titel) und Hunderte von Zeilen haben, benötigen Sie nur zwei Arten von Antworten, nicht Hunderte davon.Ich verstehe auch den Sinn der Trennung von Bedenken.

Dennoch denke ich übergreifend ListActivity.onListItemClick() (oder anrufen ListView.setOnItemClickListener() wenn Sie kein verwenden ListActivity) wäre sauberer und würde den Betrieb der Listenansicht weniger beeinträchtigen.Sie können hierfür wie folgt ein Delegatenmuster verwenden.

Definieren Sie eine abstrakte Klasse oder Schnittstelle:

public interface MyClickHandler {
    public void onItemClick(ListView l, View v, int position, long id);
}

Erstellen Sie dann jeweils eine Instanz eines Objekts, das diese Schnittstelle implementiert Typ von Zeilendaten (nicht eine Instanz für jede Zeile).Verwenden Sie in Ihrem Adapter setTag(Object) um das Tag für jede Zeile entsprechend zu initialisieren MyClickHander Beispiel.In deinem ListActivity.onListItemClick() Überschreiben Sie diese Logik:

protected void onListItemClick(ListView l, View v, int position, long id) {
    Object tag = v.getTag();
    if (tag instanceof MyClickHandler) {
        ((MyClickHandler) tag).onItemClick(l, v, position, id);
    } else {
        // default processing (if any)
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top