@ Hp.android'in yanıtı, sadece bitmap arka planları ile çalışıyorsanız, ancak benim durumumda, bir BaseAdapter
için bir dizi ImageView
s sağladım GridView
. Değiştirilmiş unbindDrawables()
durumdur böylece tavsiye olarak yöntemini:
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
...
}
fakat o zaman sorun, özyinelemeli yöntemin asla çocuklarını işlememesi AdapterView
. Bunu ele almak için aşağıdakileri yaptım:
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();
}
böylece çocukları AdapterView
hala işlenir - yöntem sadece (desteklenmeyen) tüm çocukları kaldırmaya çalışmaz.
Ancak bu ImageView
onların arka planı olmayan bir bitmap yönettiği için bu sorunu tam olarak çözmez . Bu nedenle aşağıdakileri ekledim. İdeal değil ama işe yarıyor:
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
}
Genel olarak unbindDrawables()
yöntem şu şekildedir:
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();
}
}
Bu tür kaynakları boşaltmak için daha ilkeli bir yaklaşım olmasını umuyorum.