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
This commit is contained in:
@@ -631,6 +631,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> 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<ListAdapter> 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<ListAdapter> implements Te
|
||||
mOldItemCount = mItemCount;
|
||||
mItemCount = mAdapter.getCount();
|
||||
}
|
||||
mIsAttached = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -2388,6 +2401,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
|
||||
removeCallbacks(mTouchModeReset);
|
||||
mTouchModeReset = null;
|
||||
}
|
||||
mIsAttached = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user