From d4716ba5f802d238a26b5cc31ced05f593e09859 Mon Sep 17 00:00:00 2001 From: LiRuoChen <571244399@qq.com> Date: Fri, 25 Jul 2025 19:20:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=BF=BB=E9=A1=B5=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/FlipPage/FlipPageComponentManager.cs | 218 ++++++++++---- .../FlipPage/XericFlipPageIndexVesselBase.cs | 269 +++++++++++++++--- 2 files changed, 400 insertions(+), 87 deletions(-) diff --git a/Runtime/FlipPage/FlipPageComponentManager.cs b/Runtime/FlipPage/FlipPageComponentManager.cs index df61ab9..9e24dee 100644 --- a/Runtime/FlipPage/FlipPageComponentManager.cs +++ b/Runtime/FlipPage/FlipPageComponentManager.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using Deconstruction.Runtime.UI; using JetBrains.Annotations; using Sirenix.OdinInspector; +using TMPro; using UnityEngine; using UnityEngine.UI; using XericLibrary.Runtime.MacroLibrary; @@ -120,7 +122,19 @@ namespace XericUI.FlipPage #region 字段属性 - protected ToggleGroup ToggleGroup; + + private ToggleGroup _toggleGroup; + + protected ToggleGroup ToggleGroup + { + get + { + if (_toggleGroup != null) + return _toggleGroup; + _toggleGroup = transform.GetComponentAnyway(); + return _toggleGroup; + } + } #endregion @@ -138,7 +152,7 @@ namespace XericUI.FlipPage [LabelText("页é�¢ç¿»é¡µæŒ‰é’®")] #endif [CanBeNull] - internal ObjectVessel pageIndexSelectable; + internal ObjectVessel pageSelectableVessel; protected internal override void OnPageVisible(bool quickVisit) { @@ -146,18 +160,20 @@ namespace XericUI.FlipPage return; // 自动补全外部交互动画 - if (pageIndexSelectable.IsValidVessel() && - pageIndexSelectable.Target0 is Toggle toggle && - !toggle.isOn) - { - toggle.SetIsOnWithoutNotify(true); - - } + if (pageSelectableVessel.IsValidVessel()) + SwitchSelectableVesselType(pageSelectableVessel.Target0, + null, + toggle => + { + if (!toggle.isOn) + toggle.SetIsOnWithoutNotify(true); + }); } protected internal override void OnPageInvisible(bool quickVisit) { } + } /// @@ -202,86 +218,128 @@ namespace XericUI.FlipPage pageButtonPool.Init(); // æ ¹æ�®ç»„件类型创建相关内容 - var prefabSelectable = pageButtonPool.Prefab.GetComponent(); - switch (prefabSelectable) - { - // å�•选项就创建但选项组 - case Toggle toggle: - ToggleGroup = transform.GetComponentAnyway(); - break; - case Button button: - break; - default: - break; - } + // var prefabSelectable = pageButtonPool.Prefab.GetComponent(); + } + #endregion + + #region 翻页功能 + protected override void OnFlipPage() { base.OnFlipPage(); - // 刷新所有æˆ�员的层级顺åº� for (int i = 0; i < pageSelectButton.Count; i++) { pageSelectButton[i].Target0.transform.SetSiblingIndex(i); } + + if (Currentpage is PageComponentInfo componentPage && + componentPage.pageSelectableVessel.IsValidVessel()) + { + SwitchSelectableVesselType(componentPage.pageSelectableVessel.Target0, + null, + toggle => + { + if (!toggle.isOn) + toggle.isOn = true; + }); + } } public override void FlipPage(int pageIndex, bool forceRefresh = false) { base.FlipPage(pageIndex, forceRefresh); - } - - public override void AddPageFirst(PageInfo pageInfo) - { - if (pageInfo is not PageComponentInfo componentPageInfo) - { - Debug.LogError($"页é�¢å®¹å™¨{currentPage}ä¸�支æŒ�当å‰�管ç�†å™¨ï¼Œå…¶å¿…须由{nameof(FlipPageComponentManager)}.{nameof(PageComponentInfo)}继承/声å��,å�¦åˆ™æ— æ³•支æŒ�å�Žç»­åŠŸèƒ½", this); - return; - } - - AddPageIndexButton(componentPageInfo); - base.AddPageFirst(pageInfo); - - RefreshLabelTextTotalPageCount(); RefreshPageIndeButtonState(); } - public override void AddPageLast(PageInfo pageInfo) + public override PageInfo AddPageFirst(PageInfo pageInfo) { if (pageInfo is not PageComponentInfo componentPageInfo) { - Debug.LogError($"页é�¢å®¹å™¨{currentPage}ä¸�支æŒ�当å‰�管ç�†å™¨ï¼Œå…¶å¿…须由{nameof(FlipPageComponentManager)}.{nameof(PageComponentInfo)}继承/声å��,å�¦åˆ™æ— æ³•支æŒ�å�Žç»­åŠŸèƒ½", this); - return; + Debug.LogError($"页é�¢å®¹å™¨{Currentpage}ä¸�支æŒ�当å‰�管ç�†å™¨ï¼Œå…¶å¿…须由{nameof(FlipPageComponentManager)}.{nameof(PageComponentInfo)}继承/声å��,å�¦åˆ™æ— æ³•支æŒ�å�Žç»­åŠŸèƒ½", this); + return null; } - + // 页é�¢åŸºç¡€åˆ�始化 + var result = base.AddPageFirst(pageInfo); + // 添加选择按钮 AddPageIndexButton(componentPageInfo); - base.AddPageLast(pageInfo); - - RefreshLabelTextTotalPageCount(); + // 刷新选择按钮显示状æ€� RefreshPageIndeButtonState(); + // 刷新总页数 + RefreshLabelTextTotalPageCount(); + return result; + } + + public override PageInfo AddPageLast(PageInfo pageInfo) + { + if (pageInfo is not PageComponentInfo componentPageInfo) + { + Debug.LogError($"页é�¢å®¹å™¨{Currentpage}ä¸�支æŒ�当å‰�管ç�†å™¨ï¼Œå…¶å¿…须由{nameof(FlipPageComponentManager)}.{nameof(PageComponentInfo)}继承/声å��,å�¦åˆ™æ— æ³•支æŒ�å�Žç»­åŠŸèƒ½", this); + return null; + } + // 页é�¢åŸºç¡€åˆ�始化 + var result = base.AddPageLast(pageInfo); + // 添加选择按钮 + AddPageIndexButton(componentPageInfo); + // 刷新选择按钮显示状æ€� + RefreshPageIndeButtonState(); + // 刷新总页数 + RefreshLabelTextTotalPageCount(); + return result; } public override void RemovePage(int pageIndex) { base.RemovePage(pageIndex); - + pageButtonPool.DirectlyRelease(pageSelectButton[pageIndex].Target0.gameObject); pageSelectButton.RemoveAt(pageIndex); RefreshPageIndeButtonState(); } + public override void ClearPages() + { + foreach (var pageInfo in PageInfos) + { + var page = pageInfo as PageComponentInfo; + pageButtonPool.DirectlyRelease(page.pageSelectableVessel.Target0.gameObject); + } + pageSelectButton.Clear(); + base.ClearPages(); + } + /// /// 在页é�¢ä¸Šæ·»åŠ æŒ‰é’® /// /// - private void AddPageIndexButton(PageComponentInfo pageInfo) + protected virtual void AddPageIndexButton(PageComponentInfo pageInfo) { var pageIndexSelectable = GetPageIndexButton(); - pageInfo.pageIndexSelectable = pageIndexSelectable; + pageInfo.pageSelectableVessel = pageIndexSelectable; + // 将按钮对象添加到列表中便于管ç�† + pageSelectButton.Add(pageIndexSelectable); + + SwitchSelectableVesselType(pageIndexSelectable.Target0, + button => + { + button.onClick.AddListener(() => FlipPage(pageInfo.pageNumber)); + }, + toggle => + { + toggle.isOn = pageInfo.pageNumber == currentPageIndex; + toggle.group = ToggleGroup; + toggle.onValueChanged.AddListener(b => + { + if (b) + FlipPage(pageInfo.pageNumber); + }); + }); + RefreshPageSelectableVesselLabel(pageInfo); } /// @@ -289,8 +347,14 @@ namespace XericUI.FlipPage /// private void RefreshPageIndeButtonState() { - var min = currentPageIndex - candidatesNumber / 2; - var max = currentPageIndex + candidatesNumber / 2; + var min = currentPageIndex - (int)(candidatesNumber / 2); + + min = Math.Max(min, 0); + min = pageSelectButton.Count - candidatesNumber > 0 + ? Math.Min(min, (int)(pageSelectButton.Count - candidatesNumber)) + : 0; + var max = min + (int)candidatesNumber; + for (int i = 0; i < pageSelectButton.Count; i++) { pageSelectButton[i].Target0.transform.SetSiblingIndex(i); @@ -299,13 +363,20 @@ namespace XericUI.FlipPage if (inMaximumCandidatesNumber) pageSelectButton[i].Target0.gameObject.SetActive(min <= i && i <= max); else - pageSelectButton[i].Target0.gameObject.SetActive(min < i && i < max); + pageSelectButton[i].Target0.gameObject.SetActive(min <= i && i < max); + // 看ä¸�è§�的内容ä¸�刷新 + if (!pageSelectButton[i].Target0.gameObject.activeSelf) + continue; // 更新索引 - if (pageSelectButton[i].Target0.gameObject.activeSelf) - { - pageSelectButton[i].Target1.text = MacroRegex.RegexReplace(pageIndexFormat, i); - } + pageSelectButton[i].Target1.text = MacroRegex.RegexReplace(pageIndexFormat, i + 1); + + // SwitchSelectableVesselType(pageSelectButton[i].Target0, + // null, + // toggle => + // { + // toggle.SetIsOnWithoutNotify(currentPageIndex == i); + // }); } } @@ -315,7 +386,18 @@ namespace XericUI.FlipPage private void RefreshLabelTextTotalPageCount() { if (labelTextTotalPageCount.IsValidVessel()) // 总页数更新 - labelTextTotalPageCount.Target.text = MacroRegex.RegexReplace(totalPageCountFormat, PageInfos.Count.ToString()); + labelTextTotalPageCount.Target.text = + MacroRegex.RegexReplace(totalPageCountFormat, PageInfos.Count.ToString()); + } + + /// + /// 刷新翻页按钮索引为当å‰�页é�¢ç´¢å¼• + /// + public void RefreshPageSelectableVesselLabel(PageComponentInfo page, object customInput = null) + { + if (page.pageSelectableVessel.IsValidVessel()) + page.pageSelectableVessel!.Target1.text = + MacroRegex.RegexReplace(pageIndexFormat, customInput ?? page.pageNumber); } #endregion @@ -345,7 +427,33 @@ namespace XericUI.FlipPage }); } } - + + /// + /// 处ç�†å�¯é€‰å¯¹è±¡ç±»åž‹ï¼Œå¦‚æžœè¦�支æŒ�更多的类型优先改此方法,以便获得其他所有ä½�置的编译器æ��示 + /// + /// + /// + /// + /// + protected static bool SwitchSelectableVesselType(Selectable selectable, Action /// ¿ìËÙä¯ÀÀ(ÓÃÓÚÇø·Ö¶¯»­ºÍÂß¼­£¬ÎªÕæÊ±£¬²»Ó¦µ±ÔÚ¶¯»­Ê¼þºó¼ÌÐø¼ÓÔØÊý¾Ý) protected internal abstract void OnPageInvisible(bool quickVisit); - + #endregion public override string ToString() @@ -124,6 +141,14 @@ namespace XericUI.FlipPage #endif public string name = DateTime.Now.Ticks.ToString(); + /// + /// ´ÓÁ㿪ʼ¼ÆÊýµÄÏîĿϱê + /// +#if ODIN_INSPECTOR + [LabelText("ÏîÄ¿Ë÷Òý[0, n]")] +#endif + public int itemNumber { get; internal set; } + #endregion #region ÉúÃüÖÜÆÚ @@ -159,9 +184,20 @@ namespace XericUI.FlipPage [SerializeField] protected int currentPageIndex = 0; +#if UNITY_EDITOR + /// + /// ÏÔʾµ÷ÊÔÁбí + /// +#if ODIN_INSPECTOR + [ShowInInspector] +#endif + private List PageInfoLists => _pageInfos.ToList(); +#endif + /// /// ËùÓÐÒ³Ãæ /// + private LinkedList _pageInfos = new LinkedList(); /// @@ -169,11 +205,11 @@ namespace XericUI.FlipPage /// private HashSet _itemInfos = new HashSet(); + /// /// µ±Ç°Ñ¡ÖÐÒ³Ãæ½Úµã /// - public LinkedListNode currentPageNode = null; - + protected LinkedListNode CurrentPageNode = null; /// /// ËùÓÐÒ³Ãæ @@ -183,7 +219,21 @@ namespace XericUI.FlipPage /// /// µ±Ç°Ñ¡ÖÐÒ³ÃæÄÚÈÝ /// - public PageInfo currentPage => currentPageNode.Value; + public PageInfo Currentpage => CurrentPageNode?.Value; + + /// + /// ·Ö²¼ÓÚËùÓÐÒ³ÃæÉϵÄËùÓÐÊý¾ÝÏîÄ¿ + /// + public IEnumerable AllItemInfos => _pageInfos.SelectMany(page => page.itemInfos); + + /// + /// Ò³ÃæÄ¬ÈÏ×î´óÏîÄ¿ÊýÁ¿ + /// + protected int DefaultItemCountPerPage + => defaultItemCountPerPage < 0 ? int.MaxValue : defaultItemCountPerPage; + + + private List _backupItemInfos; #endregion @@ -222,7 +272,7 @@ namespace XericUI.FlipPage { if (float.TryParse(pageNumber, out var index)) { - FlipPage((int)index, forceRefresh); + FlipPage((int)index - 1, forceRefresh); } } @@ -239,7 +289,7 @@ namespace XericUI.FlipPage (pageIndex < 0 || pageIndex >= _pageInfos.Count)) pageIndex = Mathf.Clamp(pageIndex, 0, _pageInfos.Count - 1); else - pageIndex = MacroMath.PMod(pageIndex, _pageInfos.Count - 1); + pageIndex = MacroMath.PMod(pageIndex, _pageInfos.Count); // ¼ì²é·­Ò³ÊýÁ¿ÓÐЧ if (!forceRefresh && currentPageIndex == pageIndex) return; @@ -247,23 +297,23 @@ namespace XericUI.FlipPage var pageIndexOffset = pageIndex - currentPageIndex; var lastPageIndex = currentPageIndex; // Èç¹û½Úµã²»´æÔÚ£¬Í¨¹ýË÷ÒýѰÕÒ - if (currentPageNode == null) - currentPageNode = _pageInfos.GetOrderNode().LandedIndex(currentPageIndex); + if (CurrentPageNode == null) + CurrentPageNode = _pageInfos.GetOrderNode().LandedIndex(currentPageIndex); // Èç¹ûË÷ÒýÆ«ÒÆ£¬Öð¸öÒÆ¶¯ else if (pageIndexOffset > 0) { for (var i = 0; i < pageIndexOffset; i++) { - var next = currentPageNode!.Next; - SwitchPage(next, _pageInfos.Last, i + 1 == pageIndexOffset); + var next = CurrentPageNode!.Next; + SwitchPage(next, _pageInfos.Last, i + 1 < pageIndexOffset); } } else if (pageIndexOffset < 0) { for (var i = 0; i > pageIndexOffset; i--) { - var previa = currentPageNode!.Previous; - SwitchPage(previa, _pageInfos.First, i - 1 == pageIndexOffset); + var previa = CurrentPageNode!.Previous; + SwitchPage(previa, _pageInfos.First, i - 1 > pageIndexOffset); } } // ûÓз­¶¯ÓÐЧҳ£¬Í˳ö @@ -278,16 +328,16 @@ namespace XericUI.FlipPage { if (newPageNode != null) { - currentPage.OnPageInvisible(quickPage); - currentPageNode = newPageNode; - currentPage.OnPageVisible(quickPage); + Currentpage.OnPageInvisible(quickPage); + CurrentPageNode = newPageNode; + Currentpage.OnPageVisible(quickPage); } if (canPassIndexBoundary) { - currentPage.OnPageInvisible(quickPage); - currentPageNode = defualtPageNode; - currentPage.OnPageVisible(quickPage); + Currentpage.OnPageInvisible(quickPage); + CurrentPageNode = defualtPageNode; + Currentpage.OnPageVisible(quickPage); } } } @@ -331,44 +381,49 @@ namespace XericUI.FlipPage /// /// Ìí¼ÓÒ³ÃæÔÚ¿ªÍ· /// - public virtual void AddPageFirst(PageInfo pageInfo) + public virtual PageInfo AddPageFirst(PageInfo pageInfo) { if (pageInfo == null) { Debug.LogError($"²»ÄÜÌí¼ÓÒ»¸ö¿ÕµÄÒ³ÃæÄÚÈݵ½¹ÜÀíÆ÷ÖУ¡", this); - return; + return null; } - - // Ìí¼ÓÒ³Ãæ - _pageInfos.AddFirst(pageInfo); // Ìí¼ÓÒ³ÃæÏ±ê pageInfo.pageNumber = 0; + // Ìí¼ÓÒ³Ãæ + _pageInfos.AddFirst(pageInfo); // ¸üкóÃæÒ³ÃæµÄË÷Òý RefreshAllPageNumber(); + // Ö´ÐÐÒ³ÃæÉúÃüÖÜÆÚ + pageInfo.OnPageCreated(this); // Ë¢ÐÂÒ³Ãæ FlipPage(currentPageIndex, true); + return pageInfo; } /// /// Ìí¼ÓÒ³ÃæÔÚ½áβ /// - public virtual void AddPageLast(PageInfo pageInfo) + public virtual PageInfo AddPageLast(PageInfo pageInfo) { if (pageInfo == null) { Debug.LogError($"²»ÄÜÌí¼ÓÒ»¸ö¿ÕµÄÒ³ÃæÄÚÈݵ½¹ÜÀíÆ÷ÖУ¡", this); - return; + return null; } // Ìí¼ÓÒ³ÃæÏ±ê pageInfo.pageNumber = _pageInfos.Count; // Ìí¼ÓÒ³Ãæ _pageInfos.AddLast(pageInfo); + // Ö´ÐÐÒ³ÃæÉúÃüÖÜÆÚ + pageInfo.OnPageDestroy(this); // Ë¢ÐÂÒ³Ãæ FlipPage(currentPageIndex, true); + return pageInfo; } /// - /// ÒÆ³ýÒ³Ãæ + /// ÒÆ³ýÒ³Ãæ£¨Ò³ÃæÉϵÄÊý¾ÝÄÚÈÝÒ²»áÒ»Í¬ÒÆ³ý£© /// public virtual void RemovePage(int pageIndex) { @@ -388,23 +443,50 @@ namespace XericUI.FlipPage tempPage.Value.pageNumber = tempPageNumber++; } // Èç¹ûÒÆ³ýµÄÊǵ±Ç°Ò³Ã棬ִÐйرղÙ×÷ - if (currentPageNode == page) + if (CurrentPageNode == page) { page.Value.OnPageInvisible(true); - currentPageNode = null; + CurrentPageNode = null; } + // Ö´ÐÐÒ³ÃæÉúÃüÖÜÆÚ + page.Value.OnPageDestroy(this); + // Ò³ÃæË÷ÒýÒÆ³ý _pageInfos.Remove(page); // Ë¢ÐÂÒ³Ãæ FlipPage(currentPageIndex, true); } /// - /// Çå³ýËùÓÐÒ³Ãæ + /// ½öÒÆ³ýÒ³Ãæ£¬²»»áÒÆ³ýÊý¾Ý /// - public virtual void CleanPage() + /// + public void RemovePageWithoutItems(int pageIndex) + { + BackupItemsFormPages(); + RemovePage(pageIndex); + RestoreItemsToPages(); + } + + /// + /// »ñÈ¡Ë÷ÒýϵÄÒ³Ãæ + /// + /// + /// + /// + public T IndexOfPageInfo(int pageIndex) + where T : PageInfo + => _pageInfos.LandedIndex(pageIndex) as T; + + /// + /// Çå³ýËùÓÐÒ³Ãæ (ËùÓÐÒ³ÃæÊý¾ÝÒ²»áÒ»Í¬ÒÆ³ý) + /// +#if ODIN_INSPECTOR + [HorizontalGroup("Êý¾Ý"), Button("Çå³ýËùÓÐÒ³Ãæ")] +#endif + public virtual void ClearPages() { _pageInfos.Clear(); - currentPageNode = null; + CurrentPageNode = null; currentPageIndex = 0; } @@ -436,5 +518,128 @@ namespace XericUI.FlipPage } #endregion + + #region Êý¾ÝÏîÄ¿ + + /// + /// Ìí¼ÓÊý¾ÝÏîÄ¿ + /// + public void AddItem(ItemInfo item, Func addPage) + { + // ÏòǰѰÕÒ¿Õȱ£¨ÕâÔÚÒ³Ãæ¶¼±»×¼È·Ìî³äµÄÇé¿öÏÂ×îÓÇ£© + var firstVacancy = _pageInfos + .GetReversedOrderNode() + .LastOrDefault(a + => a.Value.itemInfos.Count < DefaultItemCountPerPage); + if (firstVacancy != null) + { + firstVacancy.Value.itemInfos.Add(item); + return; + } + if (addPage == null) + { + Debug.LogError("µ±Ç°Ò³ÃæÒÑÂú£¬Êý¾ÝÏîĿ˳λÌí¼Óµ½ÐÂÒ³ÃæÖУ¬µ«Î´Ö¸¶¨Ò³Ãæ´´½¨º¯Êý£¬Ìí¼Ó¹ý³ÌÒÑÍ˳ö", this); + return; + } + // н¨Ò»¸öÒ³Ãæ´æ·ÅÊý¾Ý + addPage.Invoke().itemInfos.Add(item); + } + + /// + /// ÒÆ³ýËùÓаüº¬¸ø¶¨ÏîÄ¿µÄλÖã¨Õâ»áÔÚÒ³ÃæÉÏÁôÏ¿Õȱ£© + /// + /// + public void RemoveItem(ItemInfo item) + { + foreach (var a in AllItemInfos + .Adjoint() + .Where(a => a.obj == item) + .Reverse()) + { + ItemIndex2PageIndex(a.index); + } + } + + public void RemoveItem(int indexItem) + { + + } + + /// + /// ±£ÁôÒ³ÃæµÄ״̬ÏÂÇå¿ÕËùÓÐÊý¾Ý + /// +#if ODIN_INSPECTOR + [HorizontalGroup("Êý¾Ý"), Button("Çå³ýËùÓÐÊý¾Ý")] +#endif + public void ClearItemsWithoutPages() + { + foreach (var page in _pageInfos) + { + page.itemInfos.Clear(); + } + } + + /// + /// ʹÓÃË÷Òý¶¨Î»µ½Êý¾Ý + /// + /// + /// + /// + public T IndexOfItemInfo(int itemIndex) + where T : ItemInfo + => AllItemInfos.LandedIndex(itemIndex) as T; + + /// + /// ½«ÏîÄ¿Ë÷Òý×ªÎªÒ³ÃæË÷Òý + /// + /// + /// + public virtual int ItemIndex2PageIndex(int itemIndex) + { + return itemIndex / DefaultItemCountPerPage; + } + + /// + /// ±¸·ÝËùÓÐÊý¾ÝÏîÄ¿ + /// + public void BackupItemsFormPages() + { + _backupItemInfos = AllItemInfos.ToList(); + } + + /// + /// ±£´æËùÓÐÊý¾ÝÏîÄ¿(Ç¿ÖÆÖØÅŲÙ×÷) + /// + public void RestoreItemsToPages() + { + if (ItemIndex2PageIndex(_backupItemInfos.Count - 1) > _pageInfos.Count) + { + Debug.LogError($"ÖØÅÅÊý¾Ýʱ£¬Ô­ÓÐÊý¾ÝÊýÁ¿({_backupItemInfos.Count})³¬³öÏÖÓÐÃæ°åÊýÁ¿({_pageInfos.Count})£¬ÒѾܾøÖØÅÅ", this); + return; + } + // Ö´ÐÐÖØÅÄ + var page = _pageInfos.First; + page.Value.itemInfos.Clear(); + var pageIndex = 0; + for (int i = 0; i < _backupItemInfos.Count; i++) + { + var newPageIndex = ItemIndex2PageIndex(i); + if (pageIndex != newPageIndex) + { + pageIndex = newPageIndex; + page = page.Next; + if (page == null) + { + Debug.LogError($"ÖØÅÅÊý¾Ýʱ£¬Ò³ÃæÁ´½Ó´íÎó£¬ÖØÅű»ÆÈÖжÏ", this); + return; + } + page.Value.itemInfos.Clear(); + } + page.Value.itemInfos.Add(_backupItemInfos[i]); + } + } + + #endregion + } } \ No newline at end of file