/// <summary> /// This sets up the visible cells, adding and recycling as necessary /// </summary> private void _ResetVisibleCellViews() { int startIndex; int endIndex; // calculate the range of the visible cells _CalculateCurrentActiveCellRange(out startIndex, out endIndex); // go through each previous active cell and recycle it if it no longer falls in the range var i = 0; SmallList<int> remainingCellIndices = new SmallList<int>(); while (i < _activeCellViews.Count) { if (_activeCellViews[i].cellIndex < startIndex || _activeCellViews[i].cellIndex > endIndex) { _RecycleCell(_activeCellViews[i]); } else { // this cell index falls in the new range, so we add its // index to the reusable list remainingCellIndices.Add(_activeCellViews[i].cellIndex); i++; } } if (remainingCellIndices.Count == 0) { // there were no previous active cells remaining, // this list is either brand new, or we jumped to // an entirely different part of the list. // just add all the new cell views for (i = startIndex; i <= endIndex; i++) { _AddCellView(i, ListPositionEnum.Last); } } else { // we are able to reuse some of the previous // cell views // first add the views that come before the // previous list, going backward so that the // new views get added to the front for (i = endIndex; i >= startIndex; i--) { if (i < remainingCellIndices.First()) { _AddCellView(i, ListPositionEnum.First); } } // next add teh views that come after the // previous list, going forward and adding // at the end of the list for (i = startIndex; i <= endIndex; i++) { if (i > remainingCellIndices.Last()) { _AddCellView(i, ListPositionEnum.Last); } } } // update the start and end indices _activeCellViewsStartIndex = startIndex; _activeCellViewsEndIndex = endIndex; // adjust the padding elements to offset the cell views correctly _SetPadders(); }