From b7e0f7942b97c1f88f4aa2338cbf3623fdfdad97 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Fri, 7 Jun 2013 15:36:49 -0700 Subject: [PATCH] Don't orphan footers with transient state Bug #8725945 Selecting text in an EditText causes the View to have transient state. This would in turn cause the View to be removed from its ListView parent. When removed, the EditText would lose its AttachInfo, causing all sorts of problems. Headers and footers must not be removed, only detached. This is the part of the fix in AbsListView. Fixing AbsListView triggered a second bug: when a View is removed from the Window manager, it would keep its parent assigned, thus making it impossible to add it again to the window manager. When a ViewRootImpl goes through doDie(), it must set its content view's parent to null to properly cleanup. Change-Id: I0489daa74f8f7fcf85526f0928f8925ec30d4f42 --- core/java/android/view/ViewRootImpl.java | 1 + core/java/android/widget/AbsListView.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index bbf5ae9331530..6b2ed912d9d41 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2829,6 +2829,7 @@ public final class ViewRootImpl implements ViewParent, setAccessibilityFocus(null, null); + mView.assignParent(null); mView = null; mAttachInfo.mRootView = null; mAttachInfo.mSurface = null; diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index bf662924b7f31..219891c4627b2 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -6390,7 +6390,7 @@ public abstract class AbsListView extends AdapterView implements Te int viewType = lp.viewType; final boolean scrapHasTransientState = scrap.hasTransientState(); if (!shouldRecycleViewType(viewType) || scrapHasTransientState) { - if (viewType != ITEM_VIEW_TYPE_HEADER_OR_FOOTER || scrapHasTransientState) { + if (viewType != ITEM_VIEW_TYPE_HEADER_OR_FOOTER && scrapHasTransientState) { if (mSkippedScrap == null) { mSkippedScrap = new ArrayList(); } @@ -6464,7 +6464,7 @@ public abstract class AbsListView extends AdapterView implements Te final boolean scrapHasTransientState = victim.hasTransientState(); if (!shouldRecycleViewType(whichScrap) || scrapHasTransientState) { // Do not move views that should be ignored - if (whichScrap != ITEM_VIEW_TYPE_HEADER_OR_FOOTER || + if (whichScrap != ITEM_VIEW_TYPE_HEADER_OR_FOOTER && scrapHasTransientState) { removeDetachedView(victim, false); }