private void InternalHideItem(ItemInfo itemInfo, object userData)
        {
            IItem item = itemInfo.Item;

            if (itemInfo.Status == ItemStatus.Hidden)
            {
                return;
            }

            itemInfo.Status = ItemStatus.WillHide;
            item.OnHide(m_IsShutdown, userData);
            itemInfo.Status = ItemStatus.Hidden;

            ItemGroup itemGroup = (ItemGroup)item.ItemGroup;

            if (itemGroup == null)
            {
                throw new GameFrameworkException("Item group is invalid.");
            }

            itemGroup.RemoveItem(item);
            if (!m_ItemInfos.Remove(item.Id))
            {
                throw new GameFrameworkException("Item info is unmanaged.");
            }

            if (m_HideItemCompleteEventHandler != null)
            {
                HideItemCompleteEventArgs hideItemCompleteEventArgs = HideItemCompleteEventArgs.Create(item.Id, item.ItemAssetName, itemGroup, userData);
                m_HideItemCompleteEventHandler(this, hideItemCompleteEventArgs);
                ReferencePool.Release(hideItemCompleteEventArgs);
            }

            m_RecycleQueue.Enqueue(itemInfo);
        }