คำตอบจาก @ hp.android ทำงานได้ดีถ้าคุณเป็นเพียงการทำงานที่มีภูมิหลังบิตแมป แต่ในกรณีของฉันฉันมีBaseAdapter
ให้ชุดของImageView
s GridView
สำหรับ ฉันปรับเปลี่ยนunbindDrawables()
วิธีการตามที่แนะนำเพื่อให้สภาพเป็น:
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
...
}
AdapterView
แต่ปัญหาก็คือว่าวิธีการเรียกซ้ำไม่เคยกระบวนการเด็กของ เพื่อแก้ไขปัญหานี้ฉันได้ทำสิ่งต่อไปนี้:
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();
}
เพื่อให้ลูก ๆ ของAdapterView
ยังคงดำเนินการ - วิธีการเพียงไม่พยายามลบเด็ก ๆ (ซึ่งไม่ได้รับการสนับสนุน)
มันไม่ได้ช่วยแก้ไขปัญหาได้มากนักเนื่องจากImageView
จัดการบิตแมปที่ไม่ใช่พื้นหลัง ฉันจึงเพิ่มสิ่งต่อไปนี้ มันไม่เหมาะ แต่ใช้งานได้:
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageBitmap(null);
}
โดยรวมแล้วunbindDrawables()
วิธีการคือ:
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();
}
}
ฉันหวังว่าจะมีวิธีการที่ชัดเจนยิ่งขึ้นในการเพิ่มทรัพยากร