[NUI] fix layouter and cache clearing when property changed (#3106)
authorSangHyeon Jade Lee <sh10233.lee@samsung.com>
Fri, 28 May 2021 06:47:18 +0000 (15:47 +0900)
committerGitHub <noreply@github.com>
Fri, 28 May 2021 06:47:18 +0000 (15:47 +0900)
src/Tizen.NUI.Components/Controls/RecyclerView/CollectionView.cs
src/Tizen.NUI.Components/Controls/RecyclerView/Layouter/ItemsLayouter.cs
src/Tizen.NUI.Components/Controls/RecyclerView/RecyclerView.cs

index 9ea3075..4edf493 100755 (executable)
@@ -217,7 +217,6 @@ namespace Tizen.NUI.Components
                     {
                         prevNotifyCollectionChanged.CollectionChanged -= CollectionChanged;
                     }
-                    itemsLayouter?.Clear();
                     if (selectedItem != null) selectedItem = null;
                     selectedItems?.Clear();
                 }
@@ -227,7 +226,8 @@ namespace Tizen.NUI.Components
                 {
                     InternalItemSource?.Dispose();
                     InternalItemSource = null;
-                    //layouter.Clear()
+                    itemsLayouter?.Clear();
+                    ClearCache();
                     return;
                 }
                 if (itemsSource is INotifyCollectionChanged newNotifyCollectionChanged)
@@ -263,7 +263,6 @@ namespace Tizen.NUI.Components
                 itemTemplate = value;
                 if (value == null)
                 {
-                    //layouter.clear()
                     return;
                 }
 
@@ -288,8 +287,11 @@ namespace Tizen.NUI.Components
             }
             set
             {
+                itemsLayouter?.Clear();
+                ClearCache();
+
                 itemsLayouter = value;
-                base.InternalItemsLayouter = ItemsLayouter;
+                base.InternalItemsLayouter = itemsLayouter;
                 if (value == null)
                 {
                     needInitalizeLayouter = false;
@@ -982,6 +984,24 @@ namespace Tizen.NUI.Components
             return ItemsLayouter?.CalculateCandidateScrollPosition(position) ?? position;
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected override void ClearCache()
+        {
+            foreach (RecyclerViewItem item in recycleGroupHeaderCache)
+            {
+                Utility.Dispose(item);
+            }
+            recycleGroupHeaderCache.Clear();
+            foreach (RecyclerViewItem item in recycleGroupFooterCache)
+            {
+                Utility.Dispose(item);
+            }
+            recycleGroupFooterCache.Clear();
+            base.ClearCache();
+        }
+
+
         /// <summary>
         /// OnScroll event callback. Requesting layout to the layouter with given scrollPosition.
         /// </summary>
@@ -1049,22 +1069,6 @@ namespace Tizen.NUI.Components
                     InternalItemSource.Dispose();
                     InternalItemSource = null;
                 }
-                if (recycleGroupHeaderCache != null)
-                {
-                    foreach(RecyclerViewItem item in recycleGroupHeaderCache)
-                    {
-                        UnrealizeItem(item, false);
-                    }
-                    recycleGroupHeaderCache.Clear();
-                }
-                if (recycleGroupFooterCache != null)
-                {
-                    foreach(RecyclerViewItem item in recycleGroupFooterCache)
-                    {
-                        UnrealizeItem(item, false);
-                    }
-                    recycleGroupFooterCache.Clear();
-                }
             }
 
             base.Dispose(type);
@@ -1174,6 +1178,9 @@ namespace Tizen.NUI.Components
 
             if (needInitalizeLayouter)
             {
+                itemsLayouter.Clear();
+                ClearCache();
+
                 ItemsLayouter.Initialize(this);
                 needInitalizeLayouter = false;
             }
index de5bf13..ee78c6d 100755 (executable)
@@ -159,8 +159,13 @@ namespace Tizen.NUI.Components
                 CandidateMargin.Dispose();
                 CandidateMargin = null;
             }
+            if (Container)
+            {
+                Container.SizeHeight = 0;
+                Container.Position = new Position(0.0f, 0.0f);
+                Container = null;
+            }
             ItemsView = null;
-            Container = null;
         }
 
         /// <summary>
index f764f2e..e299209 100755 (executable)
@@ -338,6 +338,19 @@ namespace Tizen.NUI.Components
         }
 
         /// <summary>
+        /// Clear all remaining caches.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected virtual void ClearCache()
+        {
+            foreach (RecyclerViewItem item in RecycleCache)
+            {
+                Utility.Dispose(item);
+            }
+            RecycleCache.Clear();
+        }
+
+        /// <summary>
         /// On scroll event callback.
         /// </summary>        
         /// <since_tizen> 9 </since_tizen>
@@ -368,11 +381,7 @@ namespace Tizen.NUI.Components
                 // call the clear!
                 if (RecycleCache != null)
                 {
-                    foreach (RecyclerViewItem item in RecycleCache)
-                    {
-                        UnrealizeItem(item, false);
-                    }
-                    RecycleCache.Clear();
+                    ClearCache();
                 }
                 InternalItemsLayouter?.Clear();
                 InternalItemsLayouter = null;