CustomListCtrl.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. cc.Class({
  2. extends: cc.BaseClass,
  3. properties: {
  4. m_NdLayoutArr: [cc.Node],
  5. },
  6. ctor: function () {
  7. this.m_CtrlArr = new Array();
  8. this.m_IndexArr = new Array();
  9. this.m_CtrlName = new Array();
  10. this.m_TempAddArr = new Array();
  11. this.m_NdDefult = new Array();
  12. this.m_HookArr = new Array();
  13. this.m_ListInfoArr = {};
  14. this.m_ListInfoCnt = {};
  15. },
  16. onLoad: function () {
  17. for (const i in this.m_NdLayoutArr) {
  18. if (this.m_NdLayoutArr[i] == null) continue;
  19. var scrollViewEventHandler = new cc.Component.EventHandler();
  20. scrollViewEventHandler.target = this.node; // 这个 node 节点是你的事件处理代码组件所属的节点
  21. scrollViewEventHandler.component = "CustomListCtrl";// 这个是代码文件名
  22. scrollViewEventHandler.handler = "onScrollCallBack";
  23. scrollViewEventHandler.customEventData = `${i}`;
  24. var scrollview = this.m_NdLayoutArr[i].parent.parent.getComponent(cc.ScrollView);
  25. if (scrollview) scrollview.scrollEvents.push(scrollViewEventHandler);
  26. }
  27. },
  28. onScrollCallBack: function (scrollview, eventType, customEventData) {
  29. if ((eventType == cc.ScrollView.EventType.SCROLL_TO_BOTTOM && scrollview.vertical)
  30. || (eventType == cc.ScrollView.EventType.SCROLL_TO_LEFT && scrollview.horizontal)
  31. || (eventType == cc.ScrollView.EventType.BOUNCE_BOTTOM && scrollview.vertical)
  32. || (eventType == cc.ScrollView.EventType.BOUNCE_RIGHT && scrollview.horizontal)) {
  33. var ListIndex = parseInt(customEventData);
  34. if (this.m_ListInfoArr[ListIndex] == null) return;
  35. if (this.m_ListInfoCnt[ListIndex] >= this.m_ListInfoArr[ListIndex].length) return;
  36. var tempArr = this.m_ListInfoArr[ListIndex].slice(this.m_ListInfoCnt[ListIndex], this.m_ListInfoCnt[ListIndex] + window.DYNAMIC_SCROLL_CNT);
  37. for (var i in tempArr) {
  38. this.InsertListInfo(ListIndex, [this.m_ListInfoCnt[ListIndex]++, tempArr[i]]);
  39. }
  40. }
  41. },
  42. //初始化列表
  43. InitList: function (ListIndex, JsName, Hook) {
  44. this.m_CtrlName[ListIndex] = JsName; // 步骤1:存储列表项组件名称
  45. this.m_HookArr[ListIndex] = Hook;// 步骤2:存储回调钩子(父组件引用)
  46. if (this.m_CtrlArr[ListIndex] == null) this.m_CtrlArr[ListIndex] = new Array(); // 步骤3:初始化控制器数组(如果为空)
  47. if (this.m_TempAddArr[ListIndex] == null) this.m_TempAddArr[ListIndex] = new Array(); // 步骤4:初始化临时添加数组(如果为空
  48. this.RemoveListPre(ListIndex); // 步骤5:清理之前的列表数据
  49. //样本节点
  50. // 步骤6:初始化样本节点(模板节点)
  51. if (this.m_NdDefult[ListIndex] == null) {
  52. this.m_NdDefult[ListIndex] = this.m_NdLayoutArr[ListIndex].children[0];
  53. this.m_NdDefult[ListIndex].active = false;
  54. }
  55. },
  56. ForEachCtrl: function (ListIndex, Call) {
  57. for (var i = 0; this.m_CtrlArr && this.m_CtrlArr[ListIndex] && i < this.m_CtrlArr[ListIndex].length; i++) {
  58. if (this.m_CtrlArr[ListIndex][i].node.active) {
  59. Call(this.m_CtrlArr[ListIndex][i]);
  60. }
  61. }
  62. },
  63. //列表数据
  64. InsertListInfo: function (ListIndex, Info) {
  65. this.m_TempAddArr[ListIndex].push(Info);
  66. },
  67. //数据数组
  68. InsertListInfoArr: function (ListIndex, InfoArr) {
  69. this.m_ListInfoArr[ListIndex] = InfoArr;
  70. this.m_ListInfoCnt[ListIndex] = 0;
  71. var tempArr = this.m_ListInfoArr[ListIndex].slice(this.m_ListInfoCnt[ListIndex], window.DYNAMIC_SCROLL_CNT);
  72. for (var i in tempArr) {
  73. this.InsertListInfo(ListIndex, [this.m_ListInfoCnt[ListIndex]++, tempArr[i]]);
  74. }
  75. },
  76. //清理列表
  77. RemoveListPre: function (ListIndex) {
  78. this.m_ListInfoArr = {};
  79. this.m_ListInfoCnt = {};
  80. this.m_IndexArr[ListIndex] = 0;
  81. this.m_TempAddArr[ListIndex].splice(0, this.m_TempAddArr[ListIndex].length);
  82. for (var i in this.m_CtrlArr[ListIndex]) this.m_CtrlArr[ListIndex][i].node.active = false;
  83. },
  84. //列表子项
  85. GetListPre: function (ListIndex) {
  86. //队列数量
  87. var CurIndex = this.m_IndexArr[ListIndex];
  88. this.m_IndexArr[ListIndex]++;
  89. //复制节点
  90. if (this.m_CtrlArr[ListIndex][CurIndex] == null) {
  91. this.m_CtrlArr[ListIndex][CurIndex] = cc.instantiate(this.m_NdDefult[ListIndex]).getComponent(this.m_CtrlName[ListIndex]);
  92. if (this.m_CtrlArr[ListIndex][CurIndex] == null) console.log(this.m_CtrlName[ListIndex] + '没有找到!!!')
  93. this.m_NdLayoutArr[ListIndex].addChild(this.m_CtrlArr[ListIndex][CurIndex].node);
  94. }
  95. //返回挂载脚本
  96. this.m_CtrlArr[ListIndex][CurIndex].node.active = true;
  97. return this.m_CtrlArr[ListIndex][CurIndex];
  98. },
  99. update: function (dt) {
  100. //已有项设置
  101. for (var i in this.m_TempAddArr) {
  102. while (this.m_TempAddArr[i].length > 0 && this.m_IndexArr[i] < this.m_CtrlArr[i].length) {
  103. var Info = this.m_TempAddArr[i].shift();
  104. var Js = this.GetListPre(i);
  105. Js.InitPre();
  106. if (Js.SetHook && this.m_HookArr[i]) Js.SetHook(this.m_HookArr[i]);
  107. Js.SetPreInfo(Info);
  108. }
  109. }
  110. //新创建项处理
  111. for (var i in this.m_TempAddArr) {
  112. if (this.m_TempAddArr[i].length) {
  113. var Info = this.m_TempAddArr[i].shift();
  114. var Js = this.GetListPre(i);
  115. Js.InitPre();
  116. if (Js.SetHook && this.m_HookArr[i]) Js.SetHook(this.m_HookArr[i]);
  117. Js.SetPreInfo(Info);
  118. }
  119. }
  120. },
  121. });