Handling observable collection in ListView
authork.stepaniuk <k.stepaniuk@partner.samsung.com>
Wed, 11 Mar 2020 08:52:07 +0000 (09:52 +0100)
committerLukasz Stanislawski/IoT & UI Sample (PLT) /SRPOL/Engineer/Samsung Electronics <l.stanislaws@samsung.com>
Wed, 18 Mar 2020 09:18:55 +0000 (10:18 +0100)
Signed-off-by: k.stepaniuk <k.stepaniuk@partner.samsung.com>
Oobe/Oobe.Welcome/OobeWelcome.csproj
Oobe/OobeTerms/OobeTerms.csproj
Oobe/OobeWifi/Controls/ListView.cs
Oobe/OobeWifi/Controls/WifiView.cs
Oobe/OobeWifi/OobeWifi.csproj
Oobe/OobeWifi/WifiStep.cs

index 7a34d9a6df4a82d3da11d044562c776785e2a72c..03ed5fe0254201e561527815173be1ab481fbd40 100644 (file)
@@ -10,6 +10,7 @@
     <PackageReference Include="Tizen.NET" Version="8.0.0.15135">\r
       <ExcludeAssets>Runtime</ExcludeAssets>\r
     </PackageReference>\r
+    <PackageReference Include="Tizen.NET.Sdk" Version="1.0.9" />\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ProjectReference Include="..\OobeCommon\OobeCommon.csproj" />\r
index 455b3a0a84b3a1824f309d8b21c557c3254f1f88..32a8584b080a3762745641ff431812f06b54a91a 100644 (file)
@@ -10,5 +10,6 @@
     <PackageReference Include="Tizen.NET" Version="8.0.0.15135">\r
       <ExcludeAssets>Runtime</ExcludeAssets>\r
     </PackageReference>\r
+    <PackageReference Include="Tizen.NET.Sdk" Version="1.0.9" />\r
   </ItemGroup>\r
 </Project>\r
index eadbc78893bb7bffff107a5f7c5b6ce0e969cd32..12b589ef3c9d6123b34a5c95fa93ee1dea572cc8 100644 (file)
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+using System.Collections.ObjectModel;
 using System.Linq;
 using Tizen.NUI;
 using Tizen.NUI.BaseComponents;
@@ -6,36 +6,48 @@ using Tizen.NUI.Components;
 
 namespace Oobe.Wifi.Controls
 {
-    public class ListView : ScrollableBase
+    public class ListView
     {
-        private List<View> items;
+        private ObservableCollection<View> items;
+        private ScrollableBase scrollableBase = null;
+
+        public ScrollableBase View
+        {
+            get
+            {
+                if (scrollableBase == null)
+                {
+                    scrollableBase = new ScrollableBase();
+                    scrollableBase.ScrollingDirection = ScrollableBase.Direction.Vertical;
+                    scrollableBase.Size = new Size(360, 360);
+                }
+                return scrollableBase;
+            }
+        }
 
         private View LayoutView
         {
             get
             {
-                if (this.Children.Any() == false)
+                if (View.Children.Any() == false)
                 {
-                    this.Add(new View()
+                    View.Add(new View()
                     {
                         Layout = new LinearLayout()
                         {
                             LinearOrientation = LinearLayout.Orientation.Vertical,
+                            LinearAlignment = LinearLayout.Alignment.Center,
                         },
                         BackgroundColor = new Color(0.7f, 0.7f, 0.7f, 1f),
                         WidthResizePolicy = ResizePolicyType.FillToParent,
+                        HeightResizePolicy = ResizePolicyType.FitToChildren,
                     });
                 }
-                return this.Children.First();
+                return View.Children.First();
             }
         }
 
-        public ListView()
-        {
-            this.ScrollingDirection = ScrollableBase.Direction.Vertical;
-        }
-
-        public IEnumerable<View> Items
+        public ObservableCollection<View> Items
         {
             get
             {
@@ -45,27 +57,60 @@ namespace Oobe.Wifi.Controls
             {
                 if (value != items)
                 {
-                    Clear();
-                    items = value.ToList();
-                    AttachItems(items);
+                    DetachItems();
+                    items = value;
+                    AttachItems();
+                }
+            }
+        }
+
+        private void DetachItems()
+        {
+            if (items != null)
+            {
+                items.CollectionChanged -= OnCollectionChanged;
+                foreach (var child in LayoutView.Children.ToList())
+                {
+                    LayoutView.Remove(child);
                 }
+                LayoutView.HeightResizePolicy = ResizePolicyType.FitToChildren;
             }
         }
 
-        private void Clear()
+        //not thread safe
+        private void AttachItems()
         {
-            foreach (var child in LayoutView.Children.ToList())
+            if (items != null)
             {
-                LayoutView.Remove(child);
+                foreach (var item in items.ToList())
+                {
+                    LayoutView.Add(item);
+                }
+                items.CollectionChanged += OnCollectionChanged;
             }
         }
 
-        private void AttachItems(IEnumerable<View> items)
+        private void OnCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
         {
-            foreach (var item in items)
+            if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
             {
-                LayoutView.Add(item);
+                var item = e.NewItems.OfType<View>().FirstOrDefault();
+                if (item != null)
+                {
+                    LayoutView.Add(item);
+                }
+            }
+            else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
+            {
+                var item = e.OldItems.OfType<View>().FirstOrDefault();
+                if (item != null)
+                {
+                    LayoutView.Remove(item);
+                    //if scroll was at the end, make sure it is still properly aligned to the end
+                    //Tizen.Log.Debug("demo", $"{View.CurrentPage}");
+                }
             }
+            LayoutView.HeightResizePolicy = ResizePolicyType.FitToChildren;
         }
     }
 }
index 12391557fca635e55bfb1022c50a6d6efcb0a7a3..8fa16663177c2668119f08ce5fa6c65ae884b435 100644 (file)
@@ -1,15 +1,20 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
 using System.Linq;
+using System.Threading.Tasks;
 using Tizen.NUI;
 using Tizen.NUI.BaseComponents;
 
 namespace Oobe.Wifi.Controls
 {
-    public class WifiView
+    public class WifiView : IDisposable
     {
         private View view = null;
+        private ObservableCollection<View> items;
+        private int counter = 0;
 
-        private static View CreateViewAbsolute(string s)
+        private View CreateViewAbsolute(string s)
         {
             View mainView = new View()
             {
@@ -18,7 +23,7 @@ namespace Oobe.Wifi.Controls
                 WidthResizePolicy = ResizePolicyType.FillToParent,
             };
             TextLabel text = new TextLabel(s);
-            text.WidthResizePolicy = ResizePolicyType.UseNaturalSize;
+            text.WidthResizePolicy = ResizePolicyType.FillToParent;
             text.HorizontalAlignment = HorizontalAlignment.Begin;
             text.VerticalAlignment = VerticalAlignment.Center;
             text.TextColor = new Color(0.4f, 1 / (float)((s.GetHashCode() % 10) + 1), 1 / (float)((s.GetHashCode() % 20) + 1), 1);
@@ -32,19 +37,19 @@ namespace Oobe.Wifi.Controls
             return mainView;
         }
 
-        public static IEnumerable<View> CreateViews()
+        private IEnumerable<View> CreateViews(string pattern)
         {
-            foreach (var item in Enumerable.Range(1, 100))
+            foreach (var item in Enumerable.Range(1, 20))
             {
-                yield return CreateViewAbsolute($"{item}");
+                yield return CreateViewAbsolute($"{pattern}{item}");
             }
         }
-        
+
         public View View
         {
             get
             {
-                if( view == null )
+                if (view == null)
                 {
                     view = new View()
                     {
@@ -54,16 +59,31 @@ namespace Oobe.Wifi.Controls
                         },
                     };
                     view.Add(CreateText("Header"));
+                    items = new ObservableCollection<View>(CreateViews($"{counter} "));
                     view.Add(new ListView()
                     {
-                        Items = CreateViews(),
-                        Size = new Size(360, 360),
-                    });
+                        Items = items
+                    }.View);
+                    ForVerify();
                 }
                 return view;
             }
         }
 
+        private async void ForVerify()
+        {
+            counter++;
+            if (counter > 10)
+                return;
+            if (view != null)
+            {
+                await Task.Delay(2000);
+                items.RemoveAt(1);
+                //items.Insert(1, CreateViewAbsolute($"s{counter}"));
+                ForVerify();
+            }
+        }
+
         private static TextLabel CreateText(string text)
         {
             TextLabel text2 = new TextLabel(text);
@@ -72,5 +92,10 @@ namespace Oobe.Wifi.Controls
             text2.PointSize = 51.0f;
             return text2;
         }
+
+        public void Dispose()
+        {
+            view = null;
+        }
     }
 }
index 0d938f20bc0f13d6d3c6961ae2d6e930c2a26bdd..c95a791ffa48dcb6573b7835c37ce84305156bf9 100644 (file)
@@ -6,10 +6,12 @@
     <TargetFrameworkIndentifier>Tizen</TargetFrameworkIndentifier>\r
   </PropertyGroup>\r
 \r
+  <ItemGroup>\r
+    <PackageReference Include="Tizen.NET" Version="8.0.0.15135" />\r
+    <PackageReference Include="Tizen.NET.Sdk" Version="1.0.9" />\r
+  </ItemGroup>\r
+\r
   <ItemGroup>\r
     <ProjectReference Include="..\OobeCommon\OobeCommon.csproj" />\r
-    <PackageReference Include="Tizen.NET" Version="8.0.0.15135">\r
-      <ExcludeAssets>Runtime</ExcludeAssets>\r
-    </PackageReference>\r
   </ItemGroup>\r
 </Project>\r
index 8a279d5c7b6a3d370b79b6d88d8a706f1d2fc76d..47244217e16857ecefd08241e18b94c387662da3 100644 (file)
@@ -1,14 +1,14 @@
 using Oobe.Common.Interfaces;
 using Oobe.Wifi.Controls;
-using System;
 using Tizen.NUI;
 using Tizen.NUI.BaseComponents;
-using Tizen.NUI.Components;
 
 namespace Oobe.Wifi
 {
     public class WifiStep : ProcessStep
     {
+        private WifiView wifiView;
+
         public override View CreateView(IProcessNavigation nav)
         {
             var view = new View()
@@ -19,11 +19,19 @@ namespace Oobe.Wifi
                 },
             };
             view.Add(CreateText("left"));
-            view.Add(new WifiView().View);
+            wifiView = new WifiView();
+            view.Add(wifiView.View);
             view.Add(CreateText("right"));
             return view;
         }
 
+        public override void OnShutdown()
+        {
+            base.OnShutdown();
+            wifiView?.Dispose();
+            wifiView = null;
+        }
+
         private static TextLabel CreateText(string text)
         {
             TextLabel text2 = new TextLabel(text);