La réponse de @ hp.android fonctionne bien si vous ne travaillez qu'avec des arrière-plans bitmap mais, dans mon cas, j'avais BaseAdapter
un ensemble de ImageView
s pour un GridView
. J'ai modifié la unbindDrawables()
méthode comme conseillé pour que la condition soit:
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
...
}
mais le problème est alors que la méthode récursive ne traite jamais les enfants du AdapterView
. Pour résoudre ce problème, j'ai plutôt fait ce qui suit:
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 AdapterView
soient toujours traités - la méthode n'essaye tout simplement pas de supprimer tous les enfants (ce qui n'est pas pris en charge).
Cela ne résout pas tout à fait le problème, car ils ImageView
gèrent un bitmap qui n'est pas leur arrière-plan. J'ai donc ajouté ce qui suit. Ce n'est pas idéal mais ça marche:
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
}
Globalement, la 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 existe une approche plus raisonnée pour libérer de telles ressources.