From 1821ff9022f0ea5f5c5d82a96a05f46192d50c26 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Mon, 24 Jan 2011 21:44:28 -0800 Subject: Fix bug 3178934 - Make MenuBuilder notify its adapters of changes Change-Id: I28603afbdfdd913aa06f3a07065e27aff1dc524b --- .../android/internal/view/menu/MenuBuilder.java | 34 +++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) (limited to 'core') 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[] mAdapterCache = + new WeakReference[NUM_TYPES]; + private final WeakReference[] 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(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(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 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(); } } } -- cgit v1.1