A resposta do @ hp.android funciona bem se você estiver trabalhando apenas com planos de fundo de bitmap, mas, no meu caso, eu forneci BaseAdapter
um conjunto de ImageView
s para a GridView
. Modifiquei o unbindDrawables()
método conforme recomendado para que a condição seja:
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
...
}
mas o problema é que o método recursivo nunca processa os filhos do AdapterView
. Para resolver isso, fiz o seguinte:
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 os filhos do AdapterView
ainda sejam processados - o método simplesmente não tenta remover todos os filhos (o que não é suportado).
No entanto, isso não resolve o problema, já que ImageView
s gerenciamos um bitmap que não é o fundo deles. Eu, portanto, adicionei o seguinte. Não é o ideal, mas funciona:
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
}
No geral, o unbindDrawables()
método é então:
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 exista uma abordagem mais baseada em princípios para liberar esses recursos.