From b3750133db256ffa5956c8836bc86c3c22918cb1 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Mon, 8 Aug 2011 23:29:12 -0700 Subject: Fix bug 5135608 - Let AbsListView take focus while detached While it is valid to request focus while detached from a window, AbsListView did not handle it gracefully if it had an adapter whose data changed while the view was detached, since DataSetObservers are unregistered during this time. Assume that the data could have changed if we gain focus while detached. Change-Id: Id135693ffcc48ff5a9d530d335ab449180624c43 --- core/java/android/widget/AbsListView.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 9737a5a9bc07..db4df40a43b5 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -631,6 +631,11 @@ public abstract class AbsListView extends AdapterView implements Te private int mLastAccessibilityScrollEventFromIndex; private int mLastAccessibilityScrollEventToIndex; + /** + * Track if we are currently attached to a window. + */ + private boolean mIsAttached; + /** * Interface definition for a callback to be invoked when the list or grid * has been scrolled. @@ -1665,6 +1670,13 @@ public abstract class AbsListView extends AdapterView implements Te protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); if (gainFocus && mSelectedPosition < 0 && !isInTouchMode()) { + if (!mIsAttached && mAdapter != null) { + // Data may have changed while we were detached and it's valid + // to change focus while detached. Refresh so we don't die. + mDataChanged = true; + mOldItemCount = mItemCount; + mItemCount = mAdapter.getCount(); + } resurrectSelection(); } } @@ -2334,6 +2346,7 @@ public abstract class AbsListView extends AdapterView implements Te mOldItemCount = mItemCount; mItemCount = mAdapter.getCount(); } + mIsAttached = true; } @Override @@ -2388,6 +2401,7 @@ public abstract class AbsListView extends AdapterView implements Te removeCallbacks(mTouchModeReset); mTouchModeReset = null; } + mIsAttached = false; } @Override -- cgit v1.2.3-59-g8ed1b