FileDocCategorySizeDatePackage
BaseMenuPresenter.javaAPI DocAndroid 5.1 API7639Thu Mar 12 22:22:10 GMT 2015com.android.internal.view.menu

BaseMenuPresenter

public abstract class BaseMenuPresenter extends Object implements MenuPresenter
Base class for MenuPresenters that have a consistent container view and item views. Behaves similarly to an AdapterView in that existing item views will be reused if possible when items change.

Fields Summary
protected android.content.Context
mSystemContext
protected android.content.Context
mContext
protected MenuBuilder
mMenu
protected android.view.LayoutInflater
mSystemInflater
protected android.view.LayoutInflater
mInflater
private Callback
mCallback
private int
mMenuLayoutRes
private int
mItemLayoutRes
protected MenuView
mMenuView
private int
mId
Constructors Summary
public BaseMenuPresenter(android.content.Context context, int menuLayoutRes, int itemLayoutRes)
Construct a new BaseMenuPresenter.

param
context Context for generating system-supplied views
param
menuLayoutRes Layout resource ID for the menu container view
param
itemLayoutRes Layout resource ID for a single item view

        mSystemContext = context;
        mSystemInflater = LayoutInflater.from(context);
        mMenuLayoutRes = menuLayoutRes;
        mItemLayoutRes = itemLayoutRes;
    
Methods Summary
protected voidaddItemView(android.view.View itemView, int childIndex)
Add an item view at the given index.

param
itemView View to add
param
childIndex Index within the parent to insert at

        final ViewGroup currentParent = (ViewGroup) itemView.getParent();
        if (currentParent != null) {
            currentParent.removeView(itemView);
        }
        ((ViewGroup) mMenuView).addView(itemView, childIndex);
    
public abstract voidbindItemView(MenuItemImpl item, MenuView.ItemView itemView)
Bind item data to an existing item view.

param
item Item to bind
param
itemView View to populate with item data

public booleancollapseItemActionView(MenuBuilder menu, MenuItemImpl item)

        return false;
    
public MenuView.ItemViewcreateItemView(android.view.ViewGroup parent)
Create a new item view that can be re-bound to other item data later.

return
The new item view

        return (MenuView.ItemView) mSystemInflater.inflate(mItemLayoutRes, parent, false);
    
public booleanexpandItemActionView(MenuBuilder menu, MenuItemImpl item)

        return false;
    
protected booleanfilterLeftoverView(android.view.ViewGroup parent, int childIndex)
Filter the child view at index and remove it if appropriate.

param
parent Parent to filter from
param
childIndex Index to filter
return
true if the child view at index was removed

        parent.removeViewAt(childIndex);
        return true;
    
public booleanflagActionItems()

        return false;
    
public CallbackgetCallback()

        return mCallback;
    
public intgetId()

        return mId;
    
public android.view.ViewgetItemView(MenuItemImpl item, android.view.View convertView, android.view.ViewGroup parent)
Prepare an item view for use. See AdapterView for the basic idea at work here. This may require creating a new item view, but well-behaved implementations will re-use the view passed as convertView if present. The returned view will be populated with data from the item parameter.

param
item Item to present
param
convertView Existing view to reuse
param
parent Intended parent view - use for inflation.
return
View that presents the requested menu item

        MenuView.ItemView itemView;
        if (convertView instanceof MenuView.ItemView) {
            itemView = (MenuView.ItemView) convertView;
        } else {
            itemView = createItemView(parent);
        }
        bindItemView(item, itemView);
        return (View) itemView;
    
public MenuViewgetMenuView(android.view.ViewGroup root)

        if (mMenuView == null) {
            mMenuView = (MenuView) mSystemInflater.inflate(mMenuLayoutRes, root, false);
            mMenuView.initialize(mMenu);
            updateMenuView(true);
        }

        return mMenuView;
    
public voidinitForMenu(android.content.Context context, MenuBuilder menu)

        mContext = context;
        mInflater = LayoutInflater.from(mContext);
        mMenu = menu;
    
public voidonCloseMenu(MenuBuilder menu, boolean allMenusAreClosing)

        if (mCallback != null) {
            mCallback.onCloseMenu(menu, allMenusAreClosing);
        }
    
public booleanonSubMenuSelected(SubMenuBuilder menu)

        if (mCallback != null) {
            return mCallback.onOpenSubMenu(menu);
        }
        return false;
    
public voidsetCallback(Callback cb)

        mCallback = cb;
    
public voidsetId(int id)

        mId = id;
    
public booleanshouldIncludeItem(int childIndex, MenuItemImpl item)
Filter item by child index and item data.

param
childIndex Indended presentation index of this item
param
item Item to present
return
true if this item should be included in this menu presentation; false otherwise

        return true;
    
public voidupdateMenuView(boolean cleared)
Reuses item views when it can

        final ViewGroup parent = (ViewGroup) mMenuView;
        if (parent == null) return;

        int childIndex = 0;
        if (mMenu != null) {
            mMenu.flagActionItems();
            ArrayList<MenuItemImpl> visibleItems = mMenu.getVisibleItems();
            final int itemCount = visibleItems.size();
            for (int i = 0; i < itemCount; i++) {
                MenuItemImpl item = visibleItems.get(i);
                if (shouldIncludeItem(childIndex, item)) {
                    final View convertView = parent.getChildAt(childIndex);
                    final MenuItemImpl oldItem = convertView instanceof MenuView.ItemView ?
                            ((MenuView.ItemView) convertView).getItemData() : null;
                    final View itemView = getItemView(item, convertView, parent);
                    if (item != oldItem) {
                        // Don't let old states linger with new data.
                        itemView.setPressed(false);
                        itemView.jumpDrawablesToCurrentState();
                    }
                    if (itemView != convertView) {
                        addItemView(itemView, childIndex);
                    }
                    childIndex++;
                }
            }
        }

        // Remove leftover views.
        while (childIndex < parent.getChildCount()) {
            if (!filterLeftoverView(parent, childIndex)) {
                childIndex++;
            }
        }