Die Antwort von @ hp.android funktioniert gut, wenn Sie nur mit Bitmap-Hintergründen arbeiten, aber in meinem Fall hatte ich BaseAdapter
eine Reihe von ImageView
s für a GridView
. Ich habe die unbindDrawables()
Methode wie empfohlen geändert , sodass folgende Bedingung erfüllt ist:
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
...
}
aber das Problem ist dann, dass die rekursive Methode niemals die Kinder der AdapterView
. Um dies zu beheben, habe ich stattdessen Folgendes getan:
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();
}
Damit die untergeordneten AdapterView
Elemente weiterhin verarbeitet werden, versucht die Methode nicht, alle untergeordneten Elemente zu entfernen (was nicht unterstützt wird).
Dies behebt das Problem jedoch nicht ganz, da ImageView
s eine Bitmap verwaltet, die nicht ihr Hintergrund ist. Ich habe daher folgendes hinzugefügt. Es ist nicht ideal, aber es funktioniert:
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
}
Insgesamt ist die unbindDrawables()
Methode dann:
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();
}
}
Ich hoffe, dass es einen prinzipielleren Ansatz gibt, um solche Ressourcen freizusetzen.