void HandleScroll3(bool forceUpdate)
{
float pos = scrollPane.scrollingPosX;
//寻找当前位置的第一条项目
int newFirstIndex = GetIndexOnPos3(ref pos, forceUpdate);
if (newFirstIndex == _firstIndex && !forceUpdate)
return;
int oldFirstIndex = _firstIndex;
_firstIndex = newFirstIndex;
//分页模式不支持不等高,所以渲染满一页就好了
int reuseIndex = oldFirstIndex;
int virtualItemCount = _virtualItems.Count;
int pageSize = _curLineItemCount * _curLineItemCount2;
int startCol = newFirstIndex % _curLineItemCount;
float viewWidth = this.viewWidth;
int page = (int)(newFirstIndex / pageSize);
int startIndex = page * pageSize;
int lastIndex = startIndex + pageSize * 2; //测试两页
bool needRender;
itemInfoVer++;
//先标记这次要用到的项目
for (int i = startIndex; i < lastIndex; i++)
{
if (i >= _realNumItems)
continue;
int col = i % _curLineItemCount;
if (i - startIndex < pageSize)
{
if (col < startCol)
continue;
}
else
{
if (col > startCol)
continue;
}
ItemInfo ii = _virtualItems[i];
ii.updateFlag = itemInfoVer;
}
GObject lastObj = null;
int insertIndex = 0;
for (int i = startIndex; i < lastIndex; i++)
{
if (i >= _realNumItems)
continue;
int col = i % _curLineItemCount;
if (i - startIndex < pageSize)
{
if (col < startCol)
continue;
}
else
{
if (col > startCol)
continue;
}
ItemInfo ii = _virtualItems[i];
if (ii.obj == null)
{
//寻找看有没有可重用的
while (reuseIndex < virtualItemCount)
{
ItemInfo ii2 = _virtualItems[reuseIndex];
if (ii2.obj != null && ii2.updateFlag != itemInfoVer)
{
ii.obj = ii2.obj;
ii2.obj = null;
break;
}
reuseIndex++;
}
if (insertIndex == -1)
insertIndex = GetChildIndex(lastObj) + 1;
if (ii.obj == null)
{
ii.obj = _pool.GetObject(defaultItem);
this.AddChildAt(ii.obj, insertIndex);
}
else
{
insertIndex = SetChildIndexBefore(ii.obj, insertIndex);
}
insertIndex++;
if (ii.obj is GButton)
((GButton)ii.obj).selected = false;
needRender = true;
}
else
{
needRender = forceUpdate;
insertIndex = -1;
lastObj = ii.obj;
}
if (needRender)
itemRenderer(i % _numItems, ii.obj);
ii.obj.SetXY((int)(i / pageSize) * viewWidth + col * (ii.size.x + _columnGap),
(int)(i / _curLineItemCount) % _curLineItemCount2 * (ii.size.y + _lineGap));
}
//释放未使用的
for (int i = reuseIndex; i < virtualItemCount; i++)
{
ItemInfo ii = _virtualItems[i];
if (ii.updateFlag != itemInfoVer && ii.obj != null)
{
RemoveChildToPool(ii.obj);
ii.obj = null;
}
}
}