2011-10-28 4 views
10

J'ai un ListView dans une activité et je définis un adaptateur personnalisé sur ListView.Les adaptateurs d'Android doivent-ils être des classes internes statiques ou des classes internes non statiques?

Si ma classe d'adaptateur:

private static class MyAdapter extends ArrayAdapter 

ou

private class MyAdapter extends ArrayAdapter 

Je suppose que cela ne devrait pas faire de différence aussi longtemps que l'adaptateur est enfermé dans la référence d'activité, mais a voulu confirmer.

+0

(Pour les futurs lecteurs) La dernière question est à l'envers. Si vous avez une classe interne statique et que vous avez besoin d'accéder à l'activité/au contexte, vous devriez utiliser un WeakReference (s'il y a quelque chose qui pourrait survivre à l'activité). Si la classe n'est pas statique et interne, elle a une référence forte implicite à la classe externe. Dans ce cas, vous devrez également faire attention à la façon dont l'adaptateur est utilisé. L'utilisation de la statique peut aider à trouver des fuites implicites, mais ajoute une surcharge en faisant circuler un contexte/une référence faible. – lilbyrdie

+0

De même, dans tous les appels dans un adaptateur qui prennent un objet View, le contexte est disponible (View.getContext()). Vous pouvez utiliser instanceof pour vous assurer que c'est votre activité. – lilbyrdie

Répondre

15

La conservation du contexte dans un adaptateur est possible si vous faites attention à l'utilisation de l'adaptateur. Les adaptateurs sont généralement liés au cycle de vie de leur contexte (une activité), donc c'est bien. Utilisez un WeakReference seulement si cela a du sens.

+0

Pourriez-vous nous en dire plus sur la partie "attention à l'utilisation de l'adaptateur"? Donc, il semble que cela ne devrait pas d'importance, car l'adaptateur est lié au cycle de vie de l'activité. – dnkoutso

+1

Ne laissez pas l'adaptateur dans un champ statique qui dure plus longtemps que vos activités par exemple. –

+0

@RomainGuy et si nous explicitement 'null' l'objet adaptateur statique dans' onDestroy() '? Est-ce une bonne approche? –

Questions connexes