diff options
-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(); } } } |