Domanda

Sarebbe più conveniente per me registrare un unico OnClickListener per ogni riga del ListView, ma voglio essere sicuro che questa sia una pratica accettabile.Mio progettazione attuale è un modo piuttosto contorto per separare le preoccupazioni del OnClickListener da ciascun tipo di riga.

Il motivo è che ho più classi di righe nel file ListView.Ogni classe ha responsabilità e comportamenti completamente diversi.Consideriamo ad esempio a ListView che può contenere sia sottocategorie che titoli di libri.Se si fa clic sul titolo di un libro, dovrebbe iniziare una nuova attività che mostra l'immagine di copertina.Se si fa clic su una sottocategoria, viene visualizzato un nuovo elenco di libri e categorie.

Vorrei che la riga stessa mantenesse la conoscenza della propria identità e responsabilità piuttosto che dover far trapelare la conoscenza su ciascuna riga che deve essere mantenuta dall'implementatore di onItemClickListener.

Mi piacerebbe anche sapere quali sono le implicazioni sulle prestazioni di fare questo rispetto aimplementando la mia logica per capire come gestire il clic.

Ci sono svantaggi nell'implementazione onClickListener per ciascuno ListView ArrayAdapter riga invece di onItemClickListener?Sto cercando dati concreti E inconvenienti specifici piuttosto che vaghe raccomandazioni.

Dovrei aspettarmi utilizzo della memoria, tempo di inizializzazione, O velocità stazionaria (come scorrere l'elenco) essere influenzato in modo significativo?

È stato utile?

Soluzione

Non spieghi perché avresti bisogno di ascoltatori di clic separati per ogni riga, ma lo sconsiglierei.Dai un'occhiata all'utilizzo View.setTag(Object)/View.getTag() per passare dati personalizzati specifici della riga mediante i quali è possibile personalizzare la risposta di un listener di clic (condiviso).

MODIFICARE

Capisco dal tuo esempio perché vuoi qualcosa di diverso OnClickListenerè allegato alle tue righe.Avevo l'impressione che volessi una stanza separata OnClickListener istanza per ogni riga.(Questo era il motivo principale per cui lo sconsigliavo.) Se hai due tipi di righe (categorie e titoli) e centinaia di righe, hai bisogno solo di due tipi di risposte, non di centinaia.Capisco anche il punto sulla separazione delle preoccupazioni.

Tuttavia, penso che sia prioritario ListActivity.onListItemClick() (o chiamando ListView.setOnItemClickListener() se non stai utilizzando a ListActivity) sarebbe più pulito e avrebbe meno probabilità di interferire con il funzionamento della visualizzazione elenco.È possibile utilizzare un modello delegato per questo, come segue.

Definire una classe o un'interfaccia astratta:

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

Quindi crea un'istanza di un oggetto che implementa questa interfaccia per ciascuno tipo di dati di riga (non un'istanza per ogni riga).Nel tuo adattatore, usa setTag(Object) per inizializzare il tag per ogni riga nel modo appropriato MyClickHander esempio.Nel tuo ListActivity.onListItemClick() override, usa questa logica:

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)
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top