diff options
author | Adam Powell <adamp@google.com> | 2011-01-24 21:44:28 -0800 |
---|---|---|
committer | Adam Powell <adamp@google.com> | 2011-01-24 21:45:37 -0800 |
commit | 1821ff9022f0ea5f5c5d82a96a05f46192d50c26 (patch) | |
tree | c8f45357783dec46a04b2e920ba819eb7f8a18e5 /core | |
parent | 68b29902c0832d78a6557f915168694f35b7ca8e (diff) | |
download | frameworks_base-1821ff9022f0ea5f5c5d82a96a05f46192d50c26.zip frameworks_base-1821ff9022f0ea5f5c5d82a96a05f46192d50c26.tar.gz frameworks_base-1821ff9022f0ea5f5c5d82a96a05f46192d50c26.tar.bz2 |
Fix bug 3178934 - Make MenuBuilder notify its adapters of changes
Change-Id: I28603afbdfdd913aa06f3a07065e27aff1dc524b
Diffstat (limited to 'core')
-rw-r--r-- | core/java/com/android/internal/view/menu/MenuBuilder.java | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/core/java/com/android/internal/view/menu/MenuBuilder.java b/core/java/com/android/internal/view/menu/MenuBuilder.java index ff59950..14d0ac5 100644 --- a/core/java/com/android/internal/view/menu/MenuBuilder.java +++ b/core/java/com/android/internal/view/menu/MenuBuilder.java @@ -215,6 +215,11 @@ public class MenuBuilder implements Menu { private ViewGroup mMeasureActionButtonParent; + private final WeakReference<MenuAdapter>[] mAdapterCache = + new WeakReference[NUM_TYPES]; + private final WeakReference<OverflowMenuAdapter>[] mOverflowAdapterCache = + new WeakReference[NUM_TYPES]; + // Group IDs that have been added as actions - used temporarily, allocated here for reuse. private final SparseBooleanArray mActionButtonGroups = new SparseBooleanArray(); @@ -1004,6 +1009,12 @@ public class MenuBuilder implements Menu { MenuView menuView = menuTypes[i].mMenuView.get(); menuView.updateChildren(cleared); } + + MenuAdapter adapter = mAdapterCache[i] == null ? null : mAdapterCache[i].get(); + if (adapter != null) adapter.notifyDataSetChanged(); + + adapter = mOverflowAdapterCache[i] == null ? null : mOverflowAdapterCache[i].get(); + if (adapter != null) adapter.notifyDataSetChanged(); } } } @@ -1358,7 +1369,13 @@ public class MenuBuilder implements Menu { * @return A {@link MenuAdapter} for this menu with the given menu type. */ public MenuAdapter getMenuAdapter(int menuType) { - return new MenuAdapter(menuType); + MenuAdapter adapter = mAdapterCache[menuType] == null ? + null : mAdapterCache[menuType].get(); + if (adapter != null) return adapter; + + adapter = new MenuAdapter(menuType); + mAdapterCache[menuType] = new WeakReference<MenuAdapter>(adapter); + return adapter; } /** @@ -1368,7 +1385,13 @@ public class MenuBuilder implements Menu { * @return A {@link MenuAdapter} for this menu with the given menu type. */ public MenuAdapter getOverflowMenuAdapter(int menuType) { - return new OverflowMenuAdapter(menuType); + OverflowMenuAdapter adapter = mOverflowAdapterCache[menuType] == null ? + null : mOverflowAdapterCache[menuType].get(); + if (adapter != null) return adapter; + + adapter = new OverflowMenuAdapter(menuType); + mOverflowAdapterCache[menuType] = new WeakReference<OverflowMenuAdapter>(adapter); + return adapter; } void setOptionalIconsVisible(boolean visible) { @@ -1469,21 +1492,18 @@ public class MenuBuilder implements Menu { * source for overflow menu items that do not fit in the list of action items. */ private class OverflowMenuAdapter extends MenuAdapter { - private ArrayList<MenuItemImpl> mOverflowItems; - public OverflowMenuAdapter(int menuType) { super(menuType); - mOverflowItems = getNonActionItems(true); } @Override public MenuItemImpl getItem(int position) { - return mOverflowItems.get(position); + return getNonActionItems(true).get(position); } @Override public int getCount() { - return mOverflowItems.size(); + return getNonActionItems(true).size(); } } } |