Fix dispoing collectionView and related classes. (#2986)
authorSangHyeon Jade Lee <sh10233.lee@samsung.com>
Mon, 3 May 2021 06:27:39 +0000 (15:27 +0900)
committerdongsug-song <35130733+dongsug-song@users.noreply.github.com>
Fri, 7 May 2021 05:58:58 +0000 (14:58 +0900)
items and container is not cleared after view disposed.
fix collectionView and item dispose properly.

src/Tizen.NUI.Components/Controls/RecyclerView/CollectionView.cs
src/Tizen.NUI.Components/Controls/RecyclerView/Item/DefaultGridItem.cs
src/Tizen.NUI.Components/Controls/RecyclerView/Item/DefaultLinearItem.cs
src/Tizen.NUI.Components/Controls/RecyclerView/Item/DefaultTitleItem.cs
src/Tizen.NUI.Components/Controls/RecyclerView/RecyclerView.cs

index 12fa6d7..8dc3272 100755 (executable)
@@ -851,6 +851,7 @@ namespace Tizen.NUI.Components
         // Unrealize and caching the item.
         internal override void UnrealizeItem(RecyclerViewItem item, bool recycle = true)
         {
+            if (item == null) return;
             if (item == Header)
             {
                 item.Hide();
@@ -958,16 +959,11 @@ namespace Tizen.NUI.Components
 
             if (type == DisposeTypes.Explicit)
             {
-                disposed = true;
-
                 // From now on, no need to use this properties,
                 // so remove reference, to push it into garbage collector.
 
-                if (InternalItemSource != null)
-                {
-                    InternalItemSource.Dispose();
-                    InternalItemSource = null;
-                }
+                // Arugable to disposing user-created members.
+                /*
                 if (Header != null)
                 {
                     Utility.Dispose(Header);
@@ -978,6 +974,8 @@ namespace Tizen.NUI.Components
                     Utility.Dispose(Footer);
                     Footer = null;
                 }
+                */
+
                 groupHeaderTemplate = null;
                 groupFooterTemplate = null;
 
@@ -990,6 +988,27 @@ namespace Tizen.NUI.Components
                     selectedItems.Clear();
                     selectedItems = null;
                 }
+                if (InternalItemSource != null)
+                {
+                    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);
index 3155bf7..f1465df 100755 (executable)
@@ -462,18 +462,25 @@ namespace Tizen.NUI.Components
             {
                 //Extension : Extension?.OnDispose(this);
 
+                // Arugable to disposing user-created members.
+                /*
+                if (itemBadge != null)
+                {
+                    Utility.Dispose(itemBadge);
+                }
+                */
+
                 if (itemImage != null)
                 {
                     Utility.Dispose(itemImage);
+                    itemImage = null;
                 }
                 if (itemCaption != null)
                 {
                     Utility.Dispose(itemCaption);
+                    itemCaption = null;
                 }
-                if (itemBadge != null)
-                {
-                    Utility.Dispose(itemBadge);
-                }
+
             }
 
             base.Dispose(type);
index cb5ace2..81fb113 100755 (executable)
@@ -463,6 +463,8 @@ namespace Tizen.NUI.Components
             {
                 //Extension : Extension?.OnDispose(this);
 
+                // Arugable to disposing user-created members.
+                /*
                 if (itemIcon != null)
                 {
                     Utility.Dispose(itemIcon);
@@ -471,17 +473,21 @@ namespace Tizen.NUI.Components
                 {
                     Utility.Dispose(itemExtra);
                 }
+                */
                 if (itemLabel != null)
                 {
                     Utility.Dispose(itemLabel);
+                    itemLabel = null;
                 }
                 if (itemSubLabel != null)
                 {
                     Utility.Dispose(itemSubLabel);
+                    itemSubLabel = null;
                 }
                 if (itemSeperator != null)
                 {
                     Utility.Dispose(itemSeperator);
+                    itemSeperator = null;
                 }
             }
 
index 8236a63..769b893 100755 (executable)
@@ -324,17 +324,22 @@ namespace Tizen.NUI.Components
             {
                 //Extension : Extension?.OnDispose(this);
 
+                // Arugable to disposing user-created members.
+                /*
                 if (itemIcon != null)
                 {
                     Utility.Dispose(itemIcon);
                 }
+                */
                 if (itemLabel != null)
                 {
                     Utility.Dispose(itemLabel);
+                    itemLabel = null;
                 }
                 if (itemSeperator != null)
                 {
                     Utility.Dispose(itemSeperator);
+                    itemSeperator = null;
                 }
             }
 
index e8199eb..a1d4bd6 100755 (executable)
@@ -270,6 +270,7 @@ namespace Tizen.NUI.Components
         /// <param name="recycle"> Allow recycle. default is true </param>
         internal virtual void UnrealizeItem(RecyclerViewItem item, bool recycle = true)
         {
+            if (item == null) return;
             item.Index = -1;
             item.ParentItemsView = null;
             item.BindingContext = null; 
@@ -364,14 +365,12 @@ namespace Tizen.NUI.Components
 
             if (type == DisposeTypes.Explicit)
             {
-                disposed = true;
                 // call the clear!
                 if (RecycleCache != null)
                 {
                     foreach (RecyclerViewItem item in RecycleCache)
                     {
-                        //ContentContainer.Remove(item);
-                        Utility.Dispose(item);
+                        UnrealizeItem(item, false);
                     }
                     RecycleCache.Clear();
                 }
@@ -379,7 +378,11 @@ namespace Tizen.NUI.Components
                 InternalItemsLayouter = null;
                 ItemsSource = null;
                 ItemTemplate = null;
-                if (InternalItemSource != null) InternalItemSource.Dispose();
+                if (InternalItemSource != null)
+                {
+                    InternalItemSource.Dispose();
+                    InternalItemSource = null;
+                }
                 //
             }