CustomListCtrl.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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;
  45. this.m_HookArr[ListIndex] = Hook;
  46. if(this.m_CtrlArr[ListIndex] == null) this.m_CtrlArr[ListIndex] = new Array();
  47. if(this.m_TempAddArr[ListIndex] == null) this.m_TempAddArr[ListIndex] = new Array();
  48. this.RemoveListPre(ListIndex);
  49. //样本节点
  50. if( this.m_NdDefult[ListIndex] == null) {
  51. this.m_NdDefult[ListIndex] = this.m_NdLayoutArr[ListIndex].children[0];
  52. this.m_NdDefult[ListIndex].active = false;
  53. }
  54. },
  55. ForEachCtrl:function(ListIndex, Call){
  56. for (var i = 0; this.m_CtrlArr && this.m_CtrlArr[ListIndex] && i < this.m_CtrlArr[ListIndex].length; i++) {
  57. if (this.m_CtrlArr[ListIndex][i].node.active) {
  58. Call(this.m_CtrlArr[ListIndex][i]);
  59. }
  60. }
  61. },
  62. //列表数据
  63. InsertListInfo:function(ListIndex, Info){
  64. this.m_TempAddArr[ListIndex].push(Info);
  65. },
  66. //数据数组
  67. InsertListInfoArr:function(ListIndex, InfoArr){
  68. this.m_ListInfoArr[ListIndex] = InfoArr;
  69. this.m_ListInfoCnt[ListIndex] = 0;
  70. var tempArr = this.m_ListInfoArr[ListIndex].slice(this.m_ListInfoCnt[ListIndex],window.DYNAMIC_SCROLL_CNT);
  71. for(var i in tempArr ){
  72. this.InsertListInfo(ListIndex,[this.m_ListInfoCnt[ListIndex]++,tempArr[i]]);
  73. }
  74. },
  75. //清理列表
  76. RemoveListPre:function (ListIndex) {
  77. this.m_ListInfoArr = {};
  78. this.m_ListInfoCnt = {};
  79. this.m_IndexArr[ListIndex] = 0;
  80. this.m_TempAddArr[ListIndex].splice(0, this.m_TempAddArr[ListIndex].length);
  81. for(var i in this.m_CtrlArr[ListIndex]) this.m_CtrlArr[ListIndex][i].node.active = false;
  82. },
  83. //列表子项
  84. GetListPre:function(ListIndex){
  85. //队列数量
  86. var CurIndex = this.m_IndexArr[ListIndex];
  87. this.m_IndexArr[ListIndex]++;
  88. //复制节点
  89. if( this.m_CtrlArr[ListIndex][CurIndex] == null){
  90. this.m_CtrlArr[ListIndex][CurIndex] = cc.instantiate(this.m_NdDefult[ListIndex]).getComponent(this.m_CtrlName[ListIndex]);
  91. if(this.m_CtrlArr[ListIndex][CurIndex] == null) console.log(this.m_CtrlName[ListIndex]+' is not find!!!')
  92. this.m_NdLayoutArr[ListIndex].addChild(this.m_CtrlArr[ListIndex][CurIndex].node);
  93. }
  94. //返回挂载脚本
  95. this.m_CtrlArr[ListIndex][CurIndex].node.active = true;
  96. return this.m_CtrlArr[ListIndex][CurIndex];
  97. },
  98. update :function(dt) {
  99. //已有项设置
  100. for(var i in this.m_TempAddArr){
  101. while(this.m_TempAddArr[i].length > 0 && this.m_IndexArr[i] < this.m_CtrlArr[i].length){
  102. var Info = this.m_TempAddArr[i].shift();
  103. var Js = this.GetListPre(i);
  104. Js.InitPre();
  105. if(Js.SetHook && this.m_HookArr[i])Js.SetHook(this.m_HookArr[i]);
  106. Js.SetPreInfo(Info);
  107. }
  108. }
  109. //新创建项处理
  110. for(var i in this.m_TempAddArr){
  111. if(this.m_TempAddArr[i].length){
  112. var Info = this.m_TempAddArr[i].shift();
  113. var Js = this.GetListPre(i);
  114. Js.InitPre();
  115. if(Js.SetHook && this.m_HookArr[i]) Js.SetHook(this.m_HookArr[i]);
  116. Js.SetPreInfo(Info);
  117. }
  118. }
  119. },
  120. });