La risposta di @ hp.android funziona bene se stai solo lavorando con sfondi bitmap ma, nel mio caso, avevo BaseAdapter
un set di ImageView
s per a GridView
. Ho modificato il unbindDrawables()
metodo come consigliato in modo che la condizione sia:
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
...
}
ma il problema quindi è che il metodo ricorsivo non elabora mai i figli di AdapterView
. Per affrontare questo, ho invece fatto quanto segue:
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();
}
in modo che i figli del AdapterView
siano ancora elaborati - il metodo non tenta solo di rimuovere tutti i figli (che non è supportato).
Questo non risolve del tutto il problema, dal momento ImageView
che gestiscono una bitmap che non è il loro background. Ho quindi aggiunto quanto segue. Non è l'ideale ma funziona:
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
}
Complessivamente il unbindDrawables()
metodo è quindi:
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();
}
}
Spero che ci sia un approccio più di principio per liberare tali risorse.