private void UpdateViewRange(int scrollStep) { LoopInfo target = new LoopInfo { Left = scrollStep, Length = PageStepLen }; int viewCount = Mathf.Min(ItemCount - target.Left * PageDiv, PageSize); if (viewCount < 0) { viewCount = 0; } int deltaSize = viewCount - viewList.Count; for (int i = 0; i < deltaSize; i++) { viewList.Add(null); } LoopInfo intersection = target.Clamp(viewRange); int sstart = 0; int scount = 0; if (intersection.Length > 0) { sstart = Mathf.Max(0, target.GetOffset(intersection.Left) * PageDiv); scount = Mathf.Min(intersection.Length * PageDiv, viewCount); var sdir = target.GetOffset(viewRange.Left) * PageDiv; MoveItems(viewList, sstart - sdir, scount, sdir); } for (int i = 0; i < -deltaSize; i++) { DisposeItem(viewList, viewList.Count - 1); } int a = sstart; int b = a + scount - 1; for (int i = 0; i < viewCount; i++) { if (i < a || i > b) { UpdateItem(viewList, i, OffsetByPage(target, i)); } } viewRange.Left = scrollStep; viewRange.Length = PageStepLen; }