Die Antwort von @ hp.android funktioniert gut, wenn Sie nur mit Bitmap-Hintergründen arbeiten, aber in meinem Fall hatte ich BaseAdaptereine Reihe von ImageViews 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 AdapterViewElemente 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 ImageViews 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.