LoopScrollRect.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using UnityEngine;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using ET;
  6. using YIUIFramework;
  7. namespace UnityEngine.UI
  8. {
  9. public abstract partial class LoopScrollRect : LoopScrollRectBase
  10. {
  11. [HideInInspector]
  12. [NonSerialized]
  13. public IYIUILoopScrollDataSource dataSource = null;
  14. protected override void ProvideData(Transform transform, int index)
  15. {
  16. dataSource.ProvideData(transform, index);
  17. }
  18. protected override async ETTask<RectTransform> GetFromTempPool(int itemIdx)
  19. {
  20. RectTransform nextItem = null;
  21. if (deletedItemTypeStart > 0)
  22. {
  23. deletedItemTypeStart--;
  24. nextItem = m_Content.GetChild(0) as RectTransform;
  25. nextItem.SetSiblingIndex(itemIdx - itemTypeStart + deletedItemTypeStart);
  26. }
  27. else if (deletedItemTypeEnd > 0)
  28. {
  29. deletedItemTypeEnd--;
  30. nextItem = m_Content.GetChild(m_Content.childCount - 1) as RectTransform;
  31. nextItem.SetSiblingIndex(itemIdx - itemTypeStart + deletedItemTypeStart);
  32. }
  33. else
  34. {
  35. var prefabObj = await prefabSource.GetObject(itemIdx);
  36. if (prefabObj == null)
  37. {
  38. Debug.LogError($"预制异步加载错误,没有加载到预制资源 请检查");
  39. return null;
  40. }
  41. nextItem = prefabObj.transform as RectTransform;
  42. nextItem.transform.SetParent(m_Content, false);
  43. nextItem.gameObject.SetActive(true);
  44. }
  45. ProvideData(nextItem, itemIdx);
  46. return nextItem;
  47. }
  48. protected override void ReturnToTempPool(bool fromStart, int count)
  49. {
  50. if (fromStart)
  51. deletedItemTypeStart += count;
  52. else
  53. deletedItemTypeEnd += count;
  54. }
  55. protected override void ClearTempPool()
  56. {
  57. Debug.Assert(m_Content.childCount >= deletedItemTypeStart + deletedItemTypeEnd);
  58. if (deletedItemTypeStart > 0)
  59. {
  60. for (int i = deletedItemTypeStart - 1; i >= 0; i--)
  61. {
  62. prefabSource.ReturnObject(m_Content.GetChild(i));
  63. }
  64. deletedItemTypeStart = 0;
  65. }
  66. if (deletedItemTypeEnd > 0)
  67. {
  68. int t = m_Content.childCount - deletedItemTypeEnd;
  69. for (int i = m_Content.childCount - 1; i >= t; i--)
  70. {
  71. prefabSource.ReturnObject(m_Content.GetChild(i));
  72. }
  73. deletedItemTypeEnd = 0;
  74. }
  75. }
  76. }
  77. }