OSDN Git Service

Don't orphan footers with transient state
authorRomain Guy <romainguy@google.com>
Fri, 7 Jun 2013 22:36:49 +0000 (15:36 -0700)
committerThe Android Automerger <android-build@android.com>
Mon, 10 Jun 2013 22:17:48 +0000 (15:17 -0700)
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
core/java/android/widget/AbsListView.java

index bbf5ae9..6b2ed91 100644 (file)
@@ -2829,6 +2829,7 @@ public final class ViewRootImpl implements ViewParent,
 
         setAccessibilityFocus(null, null);
 
+        mView.assignParent(null);
         mView = null;
         mAttachInfo.mRootView = null;
         mAttachInfo.mSurface = null;
index bf66292..219891c 100644 (file)
@@ -6390,7 +6390,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> 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<View>();
                     }
@@ -6464,7 +6464,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> 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);
                         }