生成文章|

cocos2dx-lua 列表组件分享

2016-11-18 15:42
850
  1. --
  2. --滚动层
  3. --yangyanhuang
  4. --
  5. local CommonScroll = class("CommonScroll", require("app.common.ClientObjectID"));

  6. --@param scroll scrollView
  7. --@param itemRender 渲染项
  8. --@param itemHandler 渲染处理方法
  9. function CommonScroll:ctor(scroll,itemRender,itemHandler,itemViewIsInScroll)
  10.         CommonScroll.super.ctor(self);
  11.         scroll.__handler__ = scroll.__handler__ or {};
  12.         scroll.__scrollItemMap__ = scroll.__scrollItemMap__ or {};
  13.         table.insert(scroll.__handler__, self:getObjectID());
  14.        
  15.         -- scroll:setClippingEnabled(false)
  16.         -- scroll:setBackGroundColorType(1)
  17.         -- scroll:setBackGroundColor(cc.c4b(255,0,0,255))
  18.         -- scroll:setBackGroundColorOpacity(100)
  19.        
  20.         self.m_itemShowList = {};                --显示的列表
  21.         self.m_itemHideList = {};                --隐藏的列表
  22.         self.m_itemPointList = {};                --项目的坐标
  23.         self.m_itemDataInitList = {};        --项目数据是否初始化
  24.        
  25.         self.m_baseScroll = scroll;
  26.         self.m_itemHandler = itemHandler;

  27.         if itemViewIsInScroll then
  28.                 self:__setItemView__(itemRender);
  29.         else
  30.                 self.m_itemRender = itemRender;
  31.         end
  32.         self:setRepeatUseItemView(true);
  33.         self:setTopToBottomAdd(true);
  34.         self:setRecycleToBaseScroll(true);
  35. end

  36. --================================== 方法代理 ======================
  37. --滚动方向
  38. --ccui.ScrollViewDir.horizontal 水平
  39. --ccui.ScrollViewDir.vertical 垂直
  40. function CommonScroll:getDirection()
  41.         if not self.m_scrollDirection then
  42.                 self.m_scrollDirection = self.m_baseScroll:getDirection();
  43.         end
  44.         return self.m_scrollDirection;
  45. end

  46. function CommonScroll:setVisible(visible)
  47.         self.m_baseScroll:setVisible(visible);
  48.         return self;
  49. end       

  50. function CommonScroll:setEnabled(enabled)
  51.         self.m_baseScroll:setEnabled(enabled);
  52.         return self;
  53. end       

  54. function CommonScroll:setTouchEnabled(enabled)
  55.         self.m_baseScroll:setTouchEnabled(enabled);
  56.         return self;
  57. end       

  58. function CommonScroll:setClippingEnabled(enabled)
  59.         self.m_baseScroll:setClippingEnabled(enabled);
  60.         return self;
  61. end       

  62. function CommonScroll:getInnerContainer()
  63.         return self.m_baseScroll:getInnerContainer();
  64. end       

  65. function CommonScroll:stopScroll()
  66.         if self.m_baseScroll.stopScroll then
  67.                 self.m_baseScroll:stopScroll();
  68.         end
  69.         return self;
  70. end

  71. function CommonScroll:getInnerContainerSize()
  72.         if not self.m_innerContainerSize then
  73.                 self.m_innerContainerSize = self.m_baseScroll:getInnerContainerSize();
  74.         end
  75.         return self.m_innerContainerSize;
  76. end

  77. --================================== 方法代理 ======================

  78. function CommonScroll:setItemHandler(itemHandler)
  79.         self.m_itemHandler = itemHandler;
  80.         return self;
  81. end       

  82. function CommonScroll:setScrollHandler(scrollHandler)
  83.         self.m_scrollHandler = scrollHandler;
  84.         return self;
  85. end

  86. function CommonScroll:setTopToBottomAdd(b)
  87.         self.m_topToBottomAdd = b;
  88.         return self;
  89. end

  90. function CommonScroll:isBottom()
  91.         if self.m_viewport then
  92.                 if self.m_viewport.x < 10 and self.m_viewport.y < 10 then
  93.                         return true;
  94.                 end
  95.                 return false;
  96.         end
  97.         return true;
  98. end

  99. --是否重复使用显示项
  100. function CommonScroll:setRepeatUseItemView(b)
  101.         self.m_repeatUseItemView = b;
  102.         return self;
  103. end       

  104. --回收入滚动层的隐藏列表
  105. function CommonScroll:setRecycleToBaseScroll(b)
  106.         self.m_recycleToBaseScroll = b;
  107.         return self;
  108. end

  109. function CommonScroll:updateViewPort()
  110.         self.m_pageCount = nil;
  111.         local scrollSize = self:getScrollSize(true);
  112.         local viewport = self.m_viewport
  113.         if not viewport then
  114.                 self.m_viewport = cc.rect(0, 0, scrollSize.width, scrollSize.height);
  115.         elseif viewport.width ~= scrollSize.width or viewport.height ~= scrollSize.height then
  116.                 viewport.width = scrollSize.width;
  117.                 viewport.height = scrollSize.height;
  118.                 --滚动层size改变清空坐标信息
  119.                 self.m_itemPointList = {};
  120.         end
  121. end       

  122. --设置数据分页信息
  123. function CommonScroll:setDataPagingInfo(dataPageCount,loadDataHandler)
  124.         self.m_loadDataHandler = loadDataHandler;
  125.         self.m_dataPageCount = dataPageCount;
  126. end

  127. function CommonScroll:getItemView()
  128.         if self.m_itemView then
  129.                 return self.m_itemView;
  130.         end       
  131.         local itemView = self:__createItemView__();
  132.         self.m_baseScroll:addChild(itemView);
  133.         self:__setItemView__(itemView);
  134.         return self.m_itemView;
  135. end       

  136. function CommonScroll:__setItemView__(itemView)
  137.         itemView:setAnchorPoint(cc.p(0, 0))
  138.         self.m_itemView = itemView;
  139.         self.m_itemView:setLocalZOrder(0);
  140.         self.m_itemView:setVisible(false);
  141.         local itemSize = self:getItemSize();
  142.         self.m_itemView:setPosition(cc.p(0, -itemSize.height));
  143.         table.insert(self.m_itemHideList, itemView);
  144.        
  145.         --控件名字绑定
  146.         functions.bindUIName(itemView, itemView);
  147. end       

  148. --创建
  149. function CommonScroll:__createItemView__()
  150.         local itemView;
  151.         if self.m_itemView and self.m_itemView.clone then
  152.                 itemView = self.m_itemView:clone();
  153.                 --控件名字绑定
  154.                 local BaseUI = require("app.core.BaseUI")
  155.                 itemView.getNodeObject = BaseUI.getNodeObject
  156.                 functions.bindUIName(itemView, itemView);
  157.                 itemView:setAnchorPoint(cc.p(0, 0))
  158.                 return itemView;
  159.         end       
  160.         assert(self.m_itemRender, "CommonScroll 请检查创建参数");
  161.         if type(self.m_itemRender) == "string" then
  162.                 itemView = CCSLoader:loadFile(self.m_itemRender);
  163.                 --控件名字绑定
  164.                 functions.bindUIName(itemView, itemView);
  165.                 local BaseUI = require("app.core.BaseUI")
  166.                 itemView.getNodeObject = BaseUI.getNodeObject
  167.                 itemView:setAnchorPoint(cc.p(0, 0))
  168.         else
  169.                 itemView = self.m_itemRender:create();
  170.                 itemView:setAnchorPoint(cc.p(0, 0))
  171.         end
  172.         return itemView;
  173. end

  174. function CommonScroll:getItemSize()
  175.         if not self.m_itemSize then
  176.                 self.m_itemSize = self:getItemView():getContentSize();
  177.         end
  178.         return self.m_itemSize;
  179. end       

  180. function CommonScroll:getScrollSize(init)
  181.         if init or not self.m_scrollContentSize then
  182.                 self.m_scrollContentSize = self.m_baseScroll:getContentSize();
  183.         end
  184.         return self.m_scrollContentSize;
  185. end       

  186. function CommonScroll:__getItemViewByHideList__(index)
  187.         local itemView;
  188.         if not self.m_repeatUseItemView then
  189.                 itemView = self.m_itemHideList[index];
  190.                 if itemView then
  191.                         self.m_itemHideList[index] = false;
  192.                 end
  193.         else
  194.                 local itemViewList;
  195.                 if type(self.m_itemRender) == "string" and self.m_recycleToBaseScroll then
  196.                         local itemMap = self.m_baseScroll.__scrollItemMap__;
  197.                         itemViewList = itemMap[self.m_itemRender] or {};
  198.                 else
  199.                         itemViewList = self.m_itemHideList;
  200.                 end
  201.                 itemView = itemViewList[1];
  202.                 if itemView then
  203.                         table.remove(itemViewList, 1);
  204.                 end
  205.         end
  206.         if not itemView then
  207.                 itemView = self:__createItemView__();
  208.                 self.m_baseScroll:addChild(itemView);
  209.         end
  210.         itemView:setVisible(true);
  211.         itemView:setLocalZOrder(index);
  212.         self.m_itemShowList[index] = itemView;
  213.         return itemView;
  214. end       

  215. --移除显示列表
  216. function CommonScroll:__removeItemViewShowList__(idx)
  217.         local itemView = self.m_itemShowList[idx];
  218.         if not itemView then
  219.                 return;
  220.         end
  221.         itemView:setVisible(false);
  222.         itemView:setLocalZOrder(0);
  223.         self.m_itemShowList[idx] = false;
  224.         if not self.m_repeatUseItemView then
  225.                 self.m_itemHideList[idx] = itemView;
  226.         else
  227.                 local itemSize = self:getItemSize();
  228.                 itemView:setPosition(cc.p(0, -itemSize.height));
  229.                 if type(self.m_itemRender) == "string" and self.m_recycleToBaseScroll then
  230.                         local itemMap = self.m_baseScroll.__scrollItemMap__;
  231.                         local itemViewList = itemMap[self.m_itemRender];
  232.                         if not itemViewList then
  233.                                 itemViewList = {};
  234.                                 itemMap[self.m_itemRender] = itemViewList;
  235.                         end
  236.                         table.insert(itemViewList, itemView);
  237.                 else
  238.                         table.insert(self.m_itemHideList, itemView);
  239.                 end
  240.         end
  241. end       

  242. function CommonScroll:clearShowItemView()
  243.         for idx,v in pairs(self.m_itemShowList) do
  244.                 self:__removeItemViewShowList__(idx);
  245.         end
  246.         local dataList = self:getDataList();
  247.         for idx,v in ipairs(dataList) do
  248.                 self.m_itemShowList[idx] = false;
  249.         end
  250. end

  251. function CommonScroll:getRowCount()
  252.         return self.m_rowCount;
  253. end       

  254. function CommonScroll:getColCount()
  255.         return self.m_colCount;
  256. end       

  257. function CommonScroll:getPageCount()
  258.         if self.m_pageCount then
  259.                 return self.m_pageCount;
  260.         end       
  261.         local itemSize = self:getItemSize();
  262.         local scrollSize = self:getScrollSize();
  263.        
  264.         local pageCount;
  265.         if self:getDirection() == ccui.ScrollViewDir.horizontal then
  266.                 local rowCount = math.floor(scrollSize.height / itemSize.height);
  267.                 local colCount = math.ceil(scrollSize.width / itemSize.width);
  268.                 if rowCount < 1 then
  269.                         rowCount = 1;
  270.                 end
  271.                 pageCount = rowCount * colCount;
  272.         elseif self:getDirection() == ccui.ScrollViewDir.vertical then
  273.                 local colCount = math.floor(scrollSize.width / itemSize.width);
  274.                 local rowCount = math.ceil(scrollSize.height / itemSize.height);
  275.                 if colCount < 1 then
  276.                         colCount = 1;
  277.                 end
  278.                 pageCount = rowCount * colCount;
  279.         end
  280.         self.m_pageCount = pageCount;
  281.         return self.m_pageCount;
  282. end       

  283. function CommonScroll:__initMaxRowAndColCount__()
  284.         local itemSize = self:getItemSize();
  285.         local scrollSize = self:getScrollSize();
  286.         local dataCount = self:getDataCount();
  287.         local oldRowCount = self.m_rowCount;
  288.         local oldColCount = self.m_colCount;
  289.         if self:getDirection() == ccui.ScrollViewDir.horizontal then
  290.                 self.m_rowCount = math.floor(scrollSize.height / itemSize.height);
  291.                 if self.m_rowCount < 1 then
  292.                         self.m_rowCount = 1;
  293.                 end
  294.                 self.m_colCount = math.ceil(dataCount / self.m_rowCount);
  295.         elseif self:getDirection() == ccui.ScrollViewDir.vertical then
  296.                 self.m_colCount = math.floor(scrollSize.width / itemSize.width);
  297.                 if self.m_colCount < 1 then
  298.                         self.m_colCount = 1;
  299.                 end
  300.                 self.m_rowCount = math.ceil(dataCount / self.m_colCount);
  301.         end
  302.         --行或列数量变化了 清空坐标信息
  303.         if self.m_rowCount ~= oldRowCount or self.m_colCount ~= oldColCount then
  304.                 self.m_itemPointList = {};
  305.         end
  306. end       

  307. --更新滚动区域大小
  308. function CommonScroll:__updateInnerSize__()
  309.         self.m_innerContainerSize = nil;
  310.         self:__initMaxRowAndColCount__();
  311.         local itemSize = self:getItemSize();
  312.         local scrollSize = self:getScrollSize();
  313.         local colCount = self:getColCount();
  314.         local rowCount = self:getRowCount();
  315.        
  316.         local innerWidth = itemSize.width * colCount;
  317.         local innerHeight = itemSize.height * rowCount;
  318.         self.m_realityInnerSize = cc.size(innerWidth, innerHeight);
  319.         innerWidth = math.max(scrollSize.width, innerWidth);
  320.         innerHeight = math.max(scrollSize.height, innerHeight);
  321.        
  322.         local oldInnerSize = self.m_baseScroll:getInnerContainerSize();
  323.         --没有改变不从新设置
  324.         if oldInnerSize.width ~= innerWidth or oldInnerSize.height ~= innerHeight then
  325.                 self.m_startSetInnerSize = true;
  326.                 self.m_baseScroll:setInnerContainerSize(cc.size(innerWidth, innerHeight));
  327.                 self.m_startSetInnerSize = nil;
  328.         end
  329. end       

  330. function CommonScroll:__getViewPortPos__(index)
  331.         index = index or self.m_startIndex or 1;
  332.         local dataCount = self:getDataCount();
  333.         if index > dataCount then
  334.                 index = dataCount;
  335.         end
  336.         if index <= 1 then
  337.                 index = 1;
  338.         else
  339.                 if self:getDirection() == ccui.ScrollViewDir.horizontal then
  340.                         index = index - ((index-1) % self:getRowCount());
  341.                 elseif self:getDirection() == ccui.ScrollViewDir.vertical then
  342.                         index = index - ((index-1) % self:getColCount());
  343.                 end
  344.         end       
  345.         local viewportPos = cc.p(0,0);
  346.         if self.m_startIndex ~= index then
  347.                 self.m_startIndex = index;
  348.                
  349.                 local scrollSize = self:getScrollSize();
  350.                 local itemSize = self:getItemSize();
  351.                 local point = self:getItemPoint(index);
  352.                
  353.                 if self:getDirection() == ccui.ScrollViewDir.horizontal then
  354.                         viewportPos.x = point.left;
  355.                 elseif self:getDirection() == ccui.ScrollViewDir.vertical then
  356.                         if self.m_topToBottomAdd then
  357.                                 viewportPos.y = point.bottom - scrollSize.height + itemSize.height;
  358.                         else
  359.                                 viewportPos.y = point.bottom;
  360.                         end
  361.                 end
  362.                 self:__viewPortCheckAmend__(viewportPos);
  363.         else
  364.                 viewportPos.x = self.m_viewport.x;
  365.                 viewportPos.y = self.m_viewport.y;
  366.         end
  367.         return viewportPos;
  368. end       

  369. --显示区域检查修正
  370. function CommonScroll:__viewPortCheckAmend__(viewport)
  371.         viewport = viewport or self.m_viewport;
  372.         if not viewport then return end
  373.         local scrollSize = self:getScrollSize();
  374.         local innerSize = self:getInnerContainerSize();
  375.         if self:getDirection() == ccui.ScrollViewDir.horizontal then
  376.                 if viewport.x > innerSize.width-scrollSize.width then
  377.                         viewport.x = innerSize.width-scrollSize.width;
  378.                 end
  379.         elseif self:getDirection() == ccui.ScrollViewDir.vertical then
  380.                 if viewport.y < 0 then
  381.                         viewport.y = 0;
  382.                 elseif viewport.y > innerSize.height-scrollSize.height then
  383.                         viewport.y = innerSize.height-scrollSize.height;
  384.                 end
  385.         end
  386. end       

  387. --跳到指定index位置
  388. function CommonScroll:jumpToIndex(index)
  389.         local pos = self:__getViewPortPos__(index);
  390.         local viewport = self.m_viewport;
  391.         viewport.x = pos.x;
  392.         viewport.y = pos.y;
  393.         self:getInnerContainer():runAction(cc.Place:create(cc.p(viewport.x * -1, viewport.y * -1)))
  394.         self.m_stopIndex = nil;
  395.         self:updateShow();
  396. end       

  397. --获取项目ui
  398. function CommonScroll:getItemViewByIndex(index)
  399.         local itemView = self.m_itemShowList[index];
  400.         if itemView then
  401.                 return itemView;
  402.         end       
  403.         itemView = self.m_itemHideList[index];
  404.         if itemView then
  405.                 return itemView;
  406.         end
  407. end

  408. function CommonScroll:getIndexPercent(index)
  409.         local dataCount = self:getDataCount();
  410.         index = index or self.m_startIndex or 1;
  411.         if index > dataCount then
  412.                 index = dataCount;
  413.         end
  414.         if index < 1 then
  415.                 index = 1;
  416.         end       
  417.         if dataCount == 0 then
  418.                 return 0;
  419.         end
  420.         local rowCount = self:getRowCount();
  421.         local colCount = self:getColCount();
  422.         if self:getDirection() == ccui.ScrollViewDir.horizontal then
  423.                 local col = math.ceil(index / rowCount);
  424.                 percent = col / colCount * 100;
  425.         elseif self:getDirection() == ccui.ScrollViewDir.vertical then
  426.                 local row = math.ceil(index / colCount);
  427.                 percent = row / rowCount * 100;
  428.         end
  429.         return percent;
  430. end

  431. --滚动到指定index位置
  432. function CommonScroll:scrollToIndex(index, time, completeCall)
  433.         if self.m_scrollActin then
  434.                 self:getInnerContainer():stopAction(self.m_scrollActin);
  435.                 self.m_scrollActin = nil;
  436.         end       
  437.         time = time or 1;
  438.         local percent = self:getIndexPercent(index);
  439.         local action = cc.Sequence:create(cc.DelayTime:create(0.1), cc.CallFunc:create(function ()
  440.                 if self:getDirection() == ccui.ScrollViewDir.horizontal then
  441.                         self.m_baseScroll:scrollToPercentHorizontal(percent, time, true);
  442.                 elseif self:getDirection() == ccui.ScrollViewDir.vertical then
  443.                         self.m_baseScroll:scrollToPercentVertical(percent, time, true);
  444.                 end
  445.         end),cc.DelayTime:create(time), cc.CallFunc:create(function ()
  446.                 self.m_scrollActin = nil;
  447.                 if completeCall then
  448.                         completeCall();
  449.                 end       
  450.         end))
  451.         self.m_scrollActin = action;
  452.         self:getInnerContainer():runAction(action);
  453. end       

  454. --滚动到最下面
  455. function CommonScroll:scrollToBottom(time,completeCall)
  456.         if self.m_scrollActin then
  457.                 self:getInnerContainer():stopAction(self.m_scrollActin);
  458.                 self.m_scrollActin = nil;
  459.         end
  460.         time = time or 1;
  461.         local action = cc.Sequence:create(cc.DelayTime:create(0.1), cc.CallFunc:create(function ()
  462.                 self.m_baseScroll:scrollToBottom(time, true)
  463.         end),cc.DelayTime:create(time), cc.CallFunc:create(function ()
  464.                 self.m_scrollActin = nil;
  465.                 if completeCall then
  466.                         completeCall();
  467.                 end       
  468.         end))
  469.         self.m_scrollActin = action;
  470.         self:getInnerContainer():runAction(action);
  471. end

  472. --坐标信息
  473. function CommonScroll:getItemPoint(index)
  474.         local dataCount = self:getDataCount();
  475.         local point = self.m_itemPointList[index];
  476.         if not point then
  477.                 local itemSize = self:getItemSize();
  478.                 point = {};
  479.                 self.m_itemPointList[index] = point;
  480.                 local itemx = 0;
  481.                 local itemy = 0;
  482.                 --计算从0开始
  483.                 index = index - 1;
  484.                 if self:getDirection() == ccui.ScrollViewDir.horizontal then
  485.                         local rowCount = self:getRowCount();
  486.                         itemx = math.floor(index / rowCount) * itemSize.width;
  487.                         if index > 0 then
  488.                                 itemy = math.floor(index % rowCount) * itemSize.height;
  489.                         end
  490.                 elseif self:getDirection() == ccui.ScrollViewDir.vertical then
  491.                         local colCount = self:getColCount();
  492.                         if index > 0 then
  493.                                 itemx = math.floor(index % colCount) * itemSize.width;
  494.                         end
  495.                         itemy = math.floor(index / colCount) * itemSize.height;
  496.                 end
  497.                 local innerSize = self.m_realityInnerSize;
  498.                 local scrollSize = self:getScrollSize();
  499.                 --至上而下
  500.                 if self.m_topToBottomAdd then
  501.                         itemy = math.max(innerSize.height, scrollSize.height) - itemy - itemSize.height;
  502.                 end
  503.                 point.left = itemx;
  504.                 point.right = itemx + itemSize.width;
  505.                 point.top = itemy + itemSize.height;
  506.                 point.bottom = itemy;
  507.         end
  508.         return point;
  509. end       

  510. --检查对象是否在显示区域
  511. function CommonScroll:checkIndexCanShow(index)
  512.         local point = self:getItemPoint(index);
  513.         local viewport = self.m_viewport;
  514.         if self:getDirection() == ccui.ScrollViewDir.horizontal then
  515.                 if point.right >= viewport.x and point.left <= viewport.x + viewport.width then
  516.                         return true;
  517.                 end
  518.         elseif self:getDirection() == ccui.ScrollViewDir.vertical then
  519.                 if point.top >= viewport.y and point.bottom <= viewport.y + viewport.height then
  520.                         return true;
  521.                 end
  522.         end
  523.         return false;
  524. end       

  525. --数据源
  526. function CommonScroll:setDataList(dataList, index, dataCount)
  527.         self:updateViewPort();
  528.         self:__hideOtherHandlerItem__();

  529.         self.m_loadDataing = false;
  530.         self:stopScroll();
  531.         self.m_itemDataInitList = {};
  532.         self.m_dataList = dataList or {};
  533.         self.m_stopIndex = nil;
  534.        
  535.         --数据的数量
  536.         dataCount = dataCount or #self.m_dataList;
  537.         self.m_dataListCount = dataCount;
  538.         self:clearShowItemView();
  539.         self:__updateInnerSize__();
  540.         self:jumpToIndex(index);

  541.         --监听滚动
  542.         self.m_baseScroll:addEventListenerScrollView(handler(self, self.__scrollTouchEvent__));
  543. end

  544. --追加数据
  545. function CommonScroll:appendDataList(dataList, dataCount)
  546.         local olddataList = self:getDataList();
  547.         table.insertto(olddataList, dataList);
  548.         self:setDataList(olddataList, nil, dataCount);
  549. end

  550. function CommonScroll:getDataCount()
  551.         return self.m_dataListCount or 0;
  552. end       

  553. --隐藏其他的
  554. function CommonScroll:__hideOtherHandlerItem__()
  555.         self.m_baseScroll.__curHandler__ = self:getObjectID();
  556.         for _,objId in ipairs(self.m_baseScroll.__handler__ or {}) do
  557.                 if objId ~= self:getObjectID() then
  558.                         local oscroll = functions.getObjectByID(objId);
  559.                         if oscroll.m_scrollActin then
  560.                                 oscroll:getInnerContainer():stopAction(oscroll.m_scrollActin);
  561.                                 oscroll.m_scrollActin = nil;
  562.                         end       
  563.                         oscroll:__viewPortCheckAmend__();
  564.                         oscroll:clearShowItemView();
  565.                 end
  566.         end
  567. end       

  568. --数据源
  569. function CommonScroll:getDataList()
  570.         return self.m_dataList or {};
  571. end

  572. --刷新显示
  573. function CommonScroll:refreshShow()
  574.         local dataCount = self:getDataCount();
  575.         self:setDataList(self:getDataList(), nil, dataCount);
  576. end       

  577. --获取数据开始和结算索引
  578. function CommonScroll:__getStarAndStopIndex__()
  579.         local viewport = self.m_viewport;
  580.         local scrollSize = self:getScrollSize();
  581.         local itemSize = self:getItemSize();
  582.         local pageCount = self:getPageCount();
  583.         local dataCount = self:getDataCount();

  584.         local startIndex, stopIndex;
  585.         if self:getDirection() == ccui.ScrollViewDir.horizontal then
  586.                 local rowCount = self:getRowCount();
  587.                 local scrollVal = viewport.x;
  588.                 if scrollVal < 0 then
  589.                         scrollVal = 0;
  590.                 end
  591.                 startIndex = math.floor(scrollVal / itemSize.width);
  592.                 startIndex = startIndex * rowCount + 1;
  593.                 stopIndex = startIndex + pageCount - 1;
  594.                
  595.                 if stopIndex <= dataCount then
  596.                         local point = self:getItemPoint(stopIndex);
  597.                         if point.right < viewport.x + scrollSize.width then
  598.                                 stopIndex = stopIndex + rowCount;
  599.                         end
  600.                 end
  601.         elseif self:getDirection() == ccui.ScrollViewDir.vertical then
  602.                 local colCount = self:getColCount();
  603.                 local scrollVal = viewport.y;
  604.                 if self.m_topToBottomAdd then
  605.                         scrollVal = self.m_realityInnerSize.height - scrollVal - scrollSize.height;
  606.                 end
  607.                 if scrollVal < 0 then
  608.                         scrollVal = 0;
  609.                 end
  610.                 startIndex = math.floor(scrollVal / itemSize.height);
  611.                 startIndex = startIndex * colCount + 1;
  612.                 stopIndex = startIndex + pageCount - 1;

  613.                 if stopIndex <= dataCount then
  614.                         local point = self:getItemPoint(stopIndex);
  615.                         if self.m_topToBottomAdd then
  616.                                 if point.bottom > viewport.y then
  617.                                         stopIndex = stopIndex + colCount;
  618.                                 end
  619.                         else
  620.                                 if point.top < viewport.y + scrollSize.height then
  621.                                         stopIndex = stopIndex + colCount;
  622.                                 end
  623.                         end
  624.                 end
  625.         end
  626.         if stopIndex > dataCount then
  627.                 stopIndex = dataCount;
  628.         end
  629.         --print("==========", startIndex, stopIndex)
  630.         return startIndex, stopIndex;
  631. end       

  632. --更新显示
  633. function CommonScroll:updateShow()
  634.         local startIndex,stopIndex = self:__getStarAndStopIndex__();
  635.         --没有改变不操作
  636.         if startIndex == self.m_startIndex and stopIndex == self.m_stopIndex then
  637.                 return;
  638.         end
  639.         local function __testItemViewShow(sIdx, eIdx)
  640.                 for index=sIdx, eIdx do
  641.                         if self:checkIndexCanShow(index) then
  642.                                 if not self:updateItemViewShow(index) then
  643.                                         break;
  644.                                 end
  645.                         else
  646.                                 self:__removeItemViewShowList__(index);
  647.                         end
  648.                 end
  649.         end
  650.        
  651.         local startIdx = math.min(startIndex, self.m_startIndex or startIndex);
  652.         local stopIdx = math.max(stopIndex, self.m_stopIndex or stopIndex);
  653.         if not self.m_startIndex or not self.m_stopIndex then
  654.                 __testItemViewShow(startIdx, stopIdx);
  655.         else
  656.                 local startIdx2 = math.max(startIndex, self.m_startIndex or startIndex);
  657.                 local stopIdx2 = math.min(stopIndex, self.m_stopIndex or stopIndex);
  658.                 __testItemViewShow(startIdx, startIdx2);
  659.                 __testItemViewShow(stopIdx2, stopIdx);
  660.         end
  661.        
  662.         self.m_startIndex = startIndex;
  663.         self.m_stopIndex = stopIndex;
  664. end

  665. --更新列表项的显示
  666. function CommonScroll:updateItemViewShow(index)
  667.         --已在显示列表
  668.         if self.m_itemShowList[index] then
  669.                 return true;
  670.         end
  671.         local itemView = self:__getItemViewByHideList__(index);
  672.         --不重复项且已经初始化
  673.         if not self.m_repeatUseItemView and self.m_itemDataInitList[index] then
  674.                 return true;
  675.         end
  676.         itemView.__scroll_index__ = index;
  677.         if functions.isDebug() then
  678.                 local ClientObjectID = require("common.ClientObjectID")
  679.                 ClientObjectID.extends(self.m_baseScroll)
  680.                 itemView.__scroll_root__ = self.m_baseScroll:getObjectID()
  681.         end
  682.         local point = self:getItemPoint(index);
  683.         itemView:setPosition(point.left, point.bottom);
  684.         local dataInfo = self:getDataList()[index];
  685.         --数据不存在去加载
  686.         if not dataInfo and not self.m_initDataing then
  687.                 assert(self.m_loadDataHandler, "滚动层>>数据加载函数未设置");
  688.                 local pageIndex = math.ceil(index / self.m_dataPageCount);
  689.                 self.m_loadDataHandler(pageIndex);
  690.                 self:stopScroll();
  691.                 self.m_loadDataing = true;
  692.                 return false;
  693.         end       
  694.         --数据赋值
  695.         if dataInfo and self.m_itemHandler then
  696.                 self.m_itemHandler(itemView, dataInfo, index);
  697.                 if not self.m_repeatUseItemView then
  698.                         self.m_itemDataInitList[index] = true;
  699.                 end
  700.         end
  701.         return true;
  702. end

  703. --滚动层事件
  704. function CommonScroll:__scrollTouchEvent__(sender, eventType)
  705.         if self.m_baseScroll.__curHandler__ ~= self:getObjectID() then
  706.                 return;
  707.         end
  708.         if eventType == 9 then
  709.                 local viewport = self.m_viewport;
  710.                 if self.m_loadDataing then
  711.                         self:getInnerContainer():setPosition(cc.p(viewport.x * -1, viewport.y * -1));
  712.                         return;
  713.                 end
  714.                 local innerx,innery = self:getInnerContainer():getPosition();
  715.                 viewport.x = innerx * -1;
  716.                 viewport.y = innery * -1;
  717.                 if not self.m_startSetInnerSize then
  718.                         self:updateShow();
  719.                 end
  720.                 if self.m_scrollHandler then
  721.                         self.m_scrollHandler(sender);
  722.                 end
  723.         end       
  724. end

  725. return CommonScroll;
复制以上内容
收藏
0 条回帖
需要登陆后才可进行回复 登录

返回顶部
现在加入我们,注册一个账号 账号登陆 QQ账号登陆 微博账号登陆

微信扫一扫,马上找工作

在线客服