From 2efb9adec1ba01de9205e04bf1be53bd366e7c92 Mon Sep 17 00:00:00 2001 From: Lukasz Stanislawski Date: Fri, 30 Oct 2020 11:43:01 +0100 Subject: [PATCH] Add RecycleView to MainView --- Fitness/Controls/BindableRecyclerView.cs | 67 ++++++++++++++++++++++++++ Fitness/ViewModels/MainViewModel.cs | 33 ------------- Fitness/ViewModels/WorkoutViewModel.cs | 20 +++++++- Fitness/Views/FitnessItemView.cs | 15 ++++++ Fitness/Views/FitnessItemViewRecycleAdapter.cs | 29 +++++++++++ Fitness/Views/MainView.xaml.cs | 2 + Fitness/res/layout/FitnessItemView.xaml | 14 ++++++ Fitness/res/layout/MainView.xaml | 36 +++++++------- 8 files changed, 165 insertions(+), 51 deletions(-) create mode 100644 Fitness/Controls/BindableRecyclerView.cs create mode 100644 Fitness/Views/FitnessItemView.cs create mode 100644 Fitness/Views/FitnessItemViewRecycleAdapter.cs create mode 100644 Fitness/res/layout/FitnessItemView.xaml diff --git a/Fitness/Controls/BindableRecyclerView.cs b/Fitness/Controls/BindableRecyclerView.cs new file mode 100644 index 0000000..1d3f61b --- /dev/null +++ b/Fitness/Controls/BindableRecyclerView.cs @@ -0,0 +1,67 @@ +using System.Collections.Generic; +using Fitness.Services; +using Tizen.NUI; +using Tizen.NUI.Binding; +using Tizen.NUI.Components; + +namespace Fitness.Controls +{ + public class BindableRecyclerView : RecyclerView + { + public static readonly BindableProperty ItemsSourceProperty = + BindableProperty.Create(nameof(ItemsSource), typeof(List), typeof(BindableRecyclerView), null, propertyChanged: OnItemsSourceChanged); + + public static readonly BindableProperty SelectedItemProperty = + BindableProperty.Create(nameof(SelectedItem), typeof(object), typeof(BindableRecyclerView), null, propertyChanged: OnSelectedItemChanged); + + public BindableRecyclerView() + : base(new RecycleAdapter(), new LinearRecycleLayoutManager()) + { + // TODO workaround orientation set bug + LayoutManager.LayoutOrientation = RecycleLayoutManager.Orientation.Horizontal; + } + + public List ItemsSource + { + get => (List)GetValue(ItemsSourceProperty); + set + { + SetValue(ItemsSourceProperty, value); + } + } + + public object SelectedItem + { + get => (object)GetValue(SelectedItemProperty); + set + { + SetValue(SelectedItemProperty, value); + } + } + + public static void OnItemsSourceChanged(BindableObject bindable, object oldValue, object newValue) + { + var recycler = bindable as BindableRecyclerView; + if (recycler != null && recycler.Adapter != null) + { + var newList = newValue as List; + recycler.Adapter.Data = newList; + + // Set selected item by default on first item + if (newList.Count > 0) + { + recycler.SelectedItem = newList[0]; + } + } + } + + public static void OnSelectedItemChanged(BindableObject bindable, object oldValue, object newValue) + { + var recycler = bindable as BindableRecyclerView; + if (recycler != null && recycler.Adapter != null) + { + recycler.SelectedItem = newValue; + } + } + } +} diff --git a/Fitness/ViewModels/MainViewModel.cs b/Fitness/ViewModels/MainViewModel.cs index a0c9ff5..f6a46f1 100644 --- a/Fitness/ViewModels/MainViewModel.cs +++ b/Fitness/ViewModels/MainViewModel.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Windows.Input; using Fitness.Models; using Fitness.Services; using Tizen.Applications; @@ -10,8 +9,6 @@ namespace Fitness.ViewModels { public class MainViewModel : BaseViewModel { - private WorkoutViewModel selectedWorkout; - public MainViewModel() { Workouts = new List(new[] @@ -137,41 +134,11 @@ namespace Fitness.ViewModels ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/video-0002.jpeg", }, }); - - WatchPreview = new Command(() => { NavigationService.Instance.NavigateToExercisePreviewView(); }); - StartWorkout = new Command(() => { NavigationService.Instance.NavigateToExercisingView(); }); - SelectedWorkout = Workouts[0] as WorkoutViewModel; } /// /// List of all available workouts /// public List Workouts { get; private set; } - - /// - /// Currently selected workout - /// - public WorkoutViewModel SelectedWorkout - { - get => selectedWorkout; - set - { - if (value != selectedWorkout) - { - selectedWorkout = value; - RaisePropertyChanged(); - } - } - } - - /// - /// Stop workout - /// - public ICommand WatchPreview { get; private set; } - - /// - /// Start selected workout. - /// - public ICommand StartWorkout { get; private set; } } } diff --git a/Fitness/ViewModels/WorkoutViewModel.cs b/Fitness/ViewModels/WorkoutViewModel.cs index 5b8c9c9..48c0f5d 100644 --- a/Fitness/ViewModels/WorkoutViewModel.cs +++ b/Fitness/ViewModels/WorkoutViewModel.cs @@ -1,15 +1,23 @@ using System; using System.Windows.Input; using Fitness.Models; +using Fitness.Services; using Fitness.ViewModels; +using Tizen.NUI.Binding; -namespace Fitness.Models +namespace Fitness.ViewModels { /// /// WorkoutViewModel's information. /// public class WorkoutViewModel : BaseViewModel { + public WorkoutViewModel() + { + WatchPreview = new Command(() => { NavigationService.Instance.NavigateToExercisePreviewView(); }); + StartWorkout = new Command(() => { NavigationService.Instance.NavigateToScanningView(); }); + } + /// /// Current score /// @@ -59,5 +67,15 @@ namespace Fitness.Models /// Url to workout video /// public string VideoUrl { get; set; } + + /// + /// Stop workout + /// + public ICommand WatchPreview { get; private set; } + + /// + /// Start selected workout. + /// + public ICommand StartWorkout { get; private set; } } } diff --git a/Fitness/Views/FitnessItemView.cs b/Fitness/Views/FitnessItemView.cs new file mode 100644 index 0000000..b4689c6 --- /dev/null +++ b/Fitness/Views/FitnessItemView.cs @@ -0,0 +1,15 @@ +using Fitness.Services; +using Tizen.NUI; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; + +namespace Fitness.Views +{ + public partial class FitnessItemView : RecycleItem + { + public FitnessItemView() + { + InitializeComponent(); + } + } +} diff --git a/Fitness/Views/FitnessItemViewRecycleAdapter.cs b/Fitness/Views/FitnessItemViewRecycleAdapter.cs new file mode 100644 index 0000000..be7f200 --- /dev/null +++ b/Fitness/Views/FitnessItemViewRecycleAdapter.cs @@ -0,0 +1,29 @@ +using Fitness.Services; +using Tizen.NUI; +using Tizen.NUI.Components; + +namespace Fitness.Views +{ + public class FitnessItemViewRecycleAdapter : RecycleAdapter + { + public FitnessItemViewRecycleAdapter() + { + } + + public override RecycleItem CreateRecycleItem() + { + return new FitnessItemView(); + } + + public override void BindData(RecycleItem item) + { + item.BindingContext = Data[item.DataIndex]; + if (item is FitnessItemView fitnessItem) + { + fitnessItem.image.BindingContext = item.BindingContext; + fitnessItem.label.BindingContext = item.BindingContext; + fitnessItem.favourite.BindingContext = item.BindingContext; + } + } + } +} diff --git a/Fitness/Views/MainView.xaml.cs b/Fitness/Views/MainView.xaml.cs index 2a7fc33..b10ed98 100644 --- a/Fitness/Views/MainView.xaml.cs +++ b/Fitness/Views/MainView.xaml.cs @@ -1,6 +1,7 @@ using Fitness.Controls; using Tizen.NUI; using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; namespace Fitness.Views { @@ -12,6 +13,7 @@ namespace Fitness.Views this.button1.ApplyStyle(Styles.Buttons.Inverse); this.button2.ApplyStyle(Styles.Buttons.Regular); + this.scroller.ScrollingDirection = ScrollableBase.Direction.Horizontal; } } } diff --git a/Fitness/res/layout/FitnessItemView.xaml b/Fitness/res/layout/FitnessItemView.xaml new file mode 100644 index 0000000..9106d9b --- /dev/null +++ b/Fitness/res/layout/FitnessItemView.xaml @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/Fitness/res/layout/MainView.xaml b/Fitness/res/layout/MainView.xaml index 755da91..fef3fa4 100644 --- a/Fitness/res/layout/MainView.xaml +++ b/Fitness/res/layout/MainView.xaml @@ -13,47 +13,49 @@ - - + - + - + - - + + - - + + - + - - + + - + - + - + - + - - + + + + + -- 2.7.4