La réponse de @hp.android fonctionne bien si vous êtes simplement de travailler avec bitmap horizons, mais, dans mon cas, j'ai eu un BaseAdapter
proposant un ensemble d' ImageView
s pour GridView
. J'ai modifié l' unbindDrawables()
méthode comme conseillé, de sorte que la condition est:
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
...
}
mais le problème est alors que la méthode récursive jamais traite les enfants de l' AdapterView
. Pour répondre à cela, j'ai plutôt fait le suivant:
if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
for (int i = 0; i < viewGroup.getChildCount(); i++)
unbindDrawables(viewGroup.getChildAt(i));
if (!(view instanceof AdapterView))
viewGroup.removeAllViews();
}
afin que les enfants de l' AdapterView
sont encore traités -- la méthode juste ne pas essayer d'enlever tous les enfants (qui n'est pas pris en charge).
Ce n'est pas tout à fait corriger le problème, toutefois, depuis ImageView
s gérer une image qui n'est pas de leur arrière-plan. J'ai donc ajouté ce qui suit. Ce n'est pas l'idéal, mais ça fonctionne:
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
}
Dans l'ensemble, l' unbindDrawables()
méthode est alors:
private void unbindDrawables(View view) {
if (view.getBackground() != null)
view.getBackground().setCallback(null);
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
} else if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
for (int i = 0; i < viewGroup.getChildCount(); i++)
unbindDrawables(viewGroup.getChildAt(i));
if (!(view instanceof AdapterView))
viewGroup.removeAllViews();
}
}
J'espère qu'il y a une plus approche fondée sur des principes pour libérer ces ressources.