protected virtual void InitializeIfNeeded() { if (isInitialized) { return; } scrollRect = this.GetComponent <ScrollRect>(); layoutRp.Subscribe(OnLayoutChanged); scrollRect.OnValueChangedAsObservable() .Select(pos => layoutRp.Value == Layout.Horizontal ? pos.x : pos.y) .Pairwise() .Subscribe(x => { var val = x.Current - x.Previous; if (val < 0) { OnScrollUp(-val); } else { OnScrollDown(val); } }); pool = new ListItemPool <T>(scrollRect.content, prototype.GetComponent <ListViewItem <T> >()); pool.AddTo(this); pool.OnCreateItem .Subscribe(x => items.Add(x)); pool.OnCreateItem .Select(x => x.GetComponent <RectTransform>()) .Subscribe(SetItemLayout); isInitialized = true; }