void HandleScroll1(bool forceUpdate)
{
enterCounter++;
if (enterCounter > 3)
return;
float pos = scrollPane.scrollingPosY;
float max = pos + scrollPane.viewHeight;
bool end = max == scrollPane.contentHeight;//这个标志表示当前需要滚动到最末,无论内容变化大小
//寻找当前位置的第一条项目
int newFirstIndex = GetIndexOnPos1(ref pos, forceUpdate);
if (newFirstIndex == _firstIndex && !forceUpdate)
{
enterCounter--;
return;
}
int oldFirstIndex = _firstIndex;
_firstIndex = newFirstIndex;
int curIndex = newFirstIndex;
bool forward = oldFirstIndex > newFirstIndex;
int oldCount = this.numChildren;
int lastIndex = oldFirstIndex + oldCount - 1;
int reuseIndex = forward ? lastIndex : oldFirstIndex;
float curX = 0, curY = pos;
bool needRender;
float deltaSize = 0;
float firstItemDeltaSize = 0;
string url = defaultItem;
itemInfoVer++;
while (curIndex < _realNumItems && (end || curY < max))
{
ItemInfo ii = _virtualItems[curIndex];
if (ii.obj == null || forceUpdate)
{
if (itemProvider != null)
{
url = itemProvider(curIndex % _numItems);
if (url == null)
url = defaultItem;
}
if (ii.obj != null && ii.obj.resourceURL != url)
{
RemoveChildToPool(ii.obj);
ii.obj = null;
}
}
if (ii.obj == null)
{
//搜索最适合的重用item,保证每次刷新需要新建或者重新render的item最少
if (forward)
{
for (int j = reuseIndex; j >= oldFirstIndex; j--)
{
ItemInfo ii2 = _virtualItems[j];
if (ii2.obj != null && ii2.updateFlag != itemInfoVer && ii2.obj.resourceURL == url)
{
ii.obj = ii2.obj;
ii2.obj = null;
if (j == reuseIndex)
reuseIndex--;
break;
}
}
}
else
{
for (int j = reuseIndex; j <= lastIndex; j++)
{
ItemInfo ii2 = _virtualItems[j];
if (ii2.obj != null && ii2.updateFlag != itemInfoVer && ii2.obj.resourceURL == url)
{
ii.obj = ii2.obj;
ii2.obj = null;
if (j == reuseIndex)
reuseIndex++;
break;
}
}
}
if (ii.obj != null)
{
SetChildIndex(ii.obj, forward ? curIndex - newFirstIndex : numChildren);
}
else
{
ii.obj = _pool.GetObject(url);
if (forward)
this.AddChildAt(ii.obj, curIndex - newFirstIndex);
else
this.AddChild(ii.obj);
}
if (ii.obj is GButton)
((GButton)ii.obj).selected = false;
needRender = true;
}
else
needRender = forceUpdate;
if (needRender)
{
itemRenderer(curIndex % _numItems, ii.obj);
if (curIndex % _curLineItemCount == 0)
{
deltaSize += Mathf.CeilToInt(ii.obj.size.y) - ii.size.y;
if (curIndex == newFirstIndex && oldFirstIndex > newFirstIndex)
{
//当内容向下滚动时,如果新出现的项目大小发生变化,需要做一个位置补偿,才不会导致滚动跳动
firstItemDeltaSize = Mathf.CeilToInt(ii.obj.size.y) - ii.size.y;
}
}
ii.size.x = Mathf.CeilToInt(ii.obj.size.x);
ii.size.y = Mathf.CeilToInt(ii.obj.size.y);
}
ii.updateFlag = itemInfoVer;
ii.obj.SetXY(curX, curY);
if (curIndex == newFirstIndex) //要显示多一条才不会穿帮
max += ii.size.y;
curX += ii.size.x + _columnGap;
if (curIndex % _curLineItemCount == _curLineItemCount - 1)
{
curX = 0;
curY += ii.size.y + _lineGap;
}
curIndex++;
}
for (int i = 0; i < oldCount; i++)
{
ItemInfo ii = _virtualItems[oldFirstIndex + i];
if (ii.updateFlag != itemInfoVer && ii.obj != null)
{
RemoveChildToPool(ii.obj);
ii.obj = null;
}
}
if (deltaSize != 0 || firstItemDeltaSize != 0)
this.scrollPane.ChangeContentSizeOnScrolling(0, deltaSize, 0, firstItemDeltaSize);
if (curIndex > 0 && this.numChildren > 0 && this.container.y < 0 && GetChildAt(0).y > -this.container.y)//最后一页没填满!
HandleScroll1(false);
enterCounter--;
}