void OnScroll(float value) { var oldTopHiddenItems = topHiddenItems; topHiddenItems = GetFirstVisibleIndex(); bottomHiddenItems = Math.Max(0, strings.Count - visibleItems - topHiddenItems); if (oldTopHiddenItems == topHiddenItems) { //do nothing } // optimization on +-1 item scroll else if (oldTopHiddenItems == (topHiddenItems + 1)) { var bottomComponent = ComponentTopToBottom(); bottomComponent.Index = topHiddenItems; bottomComponent.Text.text = strings[topHiddenItems]; Coloring(bottomComponent); } else if (oldTopHiddenItems == (topHiddenItems - 1)) { var topComponent = ComponentBottomToTop(); var new_index = topHiddenItems + visibleItems - 1; topComponent.Index = new_index; topComponent.Text.text = strings[new_index]; Coloring(topComponent); } // all other cases else { //! var new_indicies = Enumerable.Range(topHiddenItems, visibleItems).ToArray(); components.ForEach((x, i) => { x.Index = new_indicies[i]; x.Text.text = strings[new_indicies[i]]; Coloring(x); }); } UpdateTopFiller(); UpdateBottomFiller(); if (layout) { layout.NeedUpdateLayout(); } }
protected void UpdateView() { RemoveCallbacks(); if ((CanOptimize()) && (customItems.Count > 0)) { visibleItems = (maxVisibleItems < customItems.Count) ? maxVisibleItems : customItems.Count; } else { visibleItems = customItems.Count; } components = GetNewComponents(); var base_items = new List <ListViewItem>(); components.ForEach(x => base_items.Add(x)); base.Items = base_items; components.ForEach((x, i) => { x.Index = i; SetData(x, customItems[i]); Coloring(x as ListViewItem); }); AddCallbacks(); topHiddenItems = 0; bottomHiddenItems = customItems.Count() - visibleItems; SetTopFiller(); SetBottomFiller(); #if UNITY_4_6_1 // force ContentSizeFitter update text width //scrollRect.verticalScrollbar.value += 0.1f; #endif if (layout) { //force rebuild layout.NeedUpdateLayout(); //layout.UpdateLayout(); } }