2011-10-28 10 views
10

Ho un controllo ListView in un'attività e sto impostando un adattatore personalizzato su ListView.Gli adattatori in Android dovrebbero essere classi interne statiche o classi interne non statiche

caso la mia classe adattatore essere:

private static class MyAdapter extends ArrayAdapter 

o

private class MyAdapter extends ArrayAdapter 

Credo che dovrebbe fare alcuna differenza finché l'adattatore è racchiuso all'interno del riferimento attività, ma ha voluto confermare che.

+0

(Per i futuri lettori) L'ultima domanda è al contrario. Se hai una classe interna statica e hai bisogno di accedere all'attività/contesto, dovresti usare un WeakReference (se c'è qualcosa che potrebbe sopravvivere all'attività). Se la classe non è statica e interiore, ha un implicito forte riferimento alla classe esterna. In tal caso, devi anche fare attenzione a come viene utilizzato l'adattatore. L'uso di statico può aiutare a trovare perdite implicite, ma aggiunge un sovraccarico nel passaggio attorno a un contesto/debole riferimento. – lilbyrdie

+0

Inoltre, in qualsiasi chiamata in un adattatore che accetta un oggetto View, il contesto è disponibile (View.getContext()). Puoi usare instanceof per assicurarti che sia la tua attività. – lilbyrdie

risposta

15

Mantenere il contesto va bene all'interno di un adattatore se si presta attenzione a come si utilizza l'adattatore. Gli adattatori sono solitamente legati al ciclo di vita del loro contesto (un'attività) quindi va bene. Utilizzare un WeakReference solo se ha senso.

+0

Potresti approfondire l'argomento "facendo attenzione a come usare l'adattatore"? Quindi sembra che non dovrebbe importare quale dei due dato che l'adattatore è legato al ciclo di vita dell'Attività. – dnkoutso

+1

Non tenere l'adattatore in un campo statico che vive più a lungo delle tue attività, per esempio. –

+0

@RomainGuy E se esplicitamente "null" l'oggetto adattatore statico in 'onDestroy()'? è un buon approccio? –