La respuesta de @ hp.android funciona bien si solo está trabajando con fondos de mapas de bits pero, en mi caso, tuve que BaseAdapter
proporcionar un conjunto de ImageView
s para a GridView
. Modifiqué el unbindDrawables()
método según lo recomendado para que la condición sea:
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
...
}
pero el problema es que el método recursivo nunca procesa los hijos de AdapterView
. Para abordar esto, en su lugar hice lo siguiente:
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();
}
para que los hijos del AdapterView
todavía se procesen, el método simplemente no intenta eliminar todos los hijos (lo que no es compatible).
Sin embargo, esto no soluciona el problema, ya que ImageView
administra un mapa de bits que no es su fondo. Por lo tanto, agregué lo siguiente. No es ideal pero funciona:
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
}
En general, el unbindDrawables()
método es entonces:
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();
}
}
Espero que haya un enfoque más basado en principios para liberar esos recursos.