diff options
author | Svetoslav Ganov <svetoslavganov@google.com> | 2013-03-18 21:23:45 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-03-18 21:23:45 +0000 |
commit | e4c9ac2df26f640fa9aeab5928e82bcc59a33da2 (patch) | |
tree | 81db1476d0bda887763adcf5f844338371982b22 | |
parent | 6750d9bd5611cb1abd0e964eae9f0f5afd164e9e (diff) | |
parent | b53c5f6b6f84518145c5cbfd3cc1729758fbc7c0 (diff) |
Merge "Remember which list child has A11y focus BEFORE clearing A11y focus." into jb-mr2-dev
-rw-r--r-- | core/java/android/widget/ListView.java | 50 |
1 files changed, 26 insertions, 24 deletions
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index 69e3177e74b1..7c40a6494442 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -1550,6 +1550,32 @@ public class ListView extends AbsListView { setSelectedPositionInt(mNextSelectedPosition); + // Remember which child, if any, had accessibility focus. This must + // occur before recycling any views, since that will clear + // accessibility focus. + final ViewRootImpl viewRootImpl = getViewRootImpl(); + if (viewRootImpl != null) { + final View accessFocusedView = viewRootImpl.getAccessibilityFocusedHost(); + if (accessFocusedView != null) { + final View accessFocusedChild = findAccessibilityFocusedChild( + accessFocusedView); + if (accessFocusedChild != null) { + if (!dataChanged || isDirectChildHeaderOrFooter(accessFocusedChild)) { + // If the views won't be changing, try to maintain + // focus on the current view host and (if + // applicable) its virtual view. + accessibilityFocusLayoutRestoreView = accessFocusedView; + accessibilityFocusLayoutRestoreNode = viewRootImpl + .getAccessibilityFocusedVirtualView(); + } else { + // Otherwise, try to maintain focus at the same + // position. + accessibilityFocusPosition = getPositionForView(accessFocusedChild); + } + } + } + } + // Pull all children into the RecycleBin. // These views will be reused if possible final int firstPosition = mFirstPosition; @@ -1590,30 +1616,6 @@ public class ListView extends AbsListView { requestFocus(); } - // Remember which child, if any, had accessibility focus. - final ViewRootImpl viewRootImpl = getViewRootImpl(); - if (viewRootImpl != null) { - final View accessFocusedView = viewRootImpl.getAccessibilityFocusedHost(); - if (accessFocusedView != null) { - final View accessFocusedChild = findAccessibilityFocusedChild( - accessFocusedView); - if (accessFocusedChild != null) { - if (!dataChanged || isDirectChildHeaderOrFooter(accessFocusedChild)) { - // If the views won't be changing, try to maintain - // focus on the current view host and (if - // applicable) its virtual view. - accessibilityFocusLayoutRestoreView = accessFocusedView; - accessibilityFocusLayoutRestoreNode = viewRootImpl - .getAccessibilityFocusedVirtualView(); - } else { - // Otherwise, try to maintain focus at the same - // position. - accessibilityFocusPosition = getPositionForView(accessFocusedChild); - } - } - } - } - // Clear out old views detachAllViewsFromParent(); recycleBin.removeSkippedScrap(); |