private void BuildDetails() { var selector = new ClassPresenterSelector(); var rowPresenter = new AgqrPlaybackControlsRowPresenter(new AgqrDetailsDescriptionPresenter()); rowPresenter.SetSecondaryActionsHidden(true); rowPresenter.BackgroundColor = Resources.GetColor(Resource.Color.AccentDark); rowPresenter.ProgressColor = Resources.GetColor(Resource.Color.Accent); selector.AddClassPresenter<PlaybackControlsRow>(rowPresenter); selector.AddClassPresenter<ListRow>(new ListRowPresenter()); this._rowsAdapter = new ArrayObjectAdapter(selector); var nowPlaying = ApplicationMain.ServiceLocator.GetInstance<NowPlaying>(); var playbackPlayer = ((PlaybackPlayerFragmentBase)this.ParentFragment); var playbackControlsRow = new PlaybackControlsRow(new PlaybackControlsRowViewModel(playbackPlayer, nowPlaying)); var controlPresenterSelector = new ControlButtonPresenterSelector(); var primaryActions = new ArrayObjectAdapter(controlPresenterSelector); var primaryActionsDefinition = this.GetPrimaryActionDefinition(); var secondaryActions = new ArrayObjectAdapter(controlPresenterSelector); var secondaryActionsDefinition = this.GetSecondaryActionDefinition(); playbackControlsRow.PrimaryActionsAdapter = primaryActions; playbackControlsRow.SecondaryActionsAdapter = secondaryActions; primaryActions.AddAll(0, primaryActionsDefinition.Keys); secondaryActions.AddAll(0, secondaryActionsDefinition.Keys); this._rowsAdapter.Add(playbackControlsRow); Observable.FromEventPattern<ActionClickedEventArgs>(h => rowPresenter.ActionClicked += h, h => rowPresenter.ActionClicked -= h) .Select(x => x.EventArgs.Action) .Select(x => new { Action = primaryActionsDefinition.ContainsKey(x) ? primaryActionsDefinition[x] : secondaryActionsDefinition[x], Target = x }) .Subscribe(x => x.Action(x.Target)) .AddTo(this.LifetimeDisposables); playbackPlayer.IsPlaying .ObserveOnUIDispatcher() .Subscribe(x => { var playPauseAction = primaryActionsDefinition.Select(y => y.Key).OfType<PlaybackControlsRow.PlayPauseAction>().Single(); playPauseAction.Index = x ? PlaybackControlsRow.PlayPauseAction.Pause : PlaybackControlsRow.PlayPauseAction.Play; this._rowsAdapter.NotifyArrayItemRangeChanged(0, 1); }) .AddTo(this.LifetimeDisposables); playbackPlayer.ElapsedSeconds .ObserveOnUIDispatcher() .Subscribe(x => { playbackControlsRow.CurrentTime = x*1000; //this._rowsAdapter.NotifyArrayItemRangeChanged(0, 1); // こっちは通知してはダメ(ガコガコする }) .AddTo(this.LifetimeDisposables); nowPlaying.Program .Where(x => x != null) .ObserveOnUIDispatcher() .Subscribe(x => { playbackControlsRow.TotalTime = (int) (x.End - x.Start).TotalMilliseconds; this._rowsAdapter.NotifyArrayItemRangeChanged(0, 1); }) .AddTo(this.LifetimeDisposables); this.Adapter = this._rowsAdapter; }