diff --git a/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Android.cs b/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Android.cs index dcf87f722158..d3e83571a4d9 100644 --- a/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Android.cs +++ b/src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.Android.cs @@ -14,10 +14,12 @@ public partial class StructuredItemsViewHandler : ItemsViewHandler handler, StructuredItemsView itemsView) { + handler.UpdateHeaderFooter(true); } public static void MapFooterTemplate(StructuredItemsViewHandler handler, StructuredItemsView itemsView) { + handler.UpdateHeaderFooter(false); } public static void MapItemsLayout(StructuredItemsViewHandler handler, StructuredItemsView itemsView) @@ -25,5 +27,73 @@ public static void MapItemsLayout(StructuredItemsViewHandler handler public static void MapItemSizingStrategy(StructuredItemsViewHandler handler, StructuredItemsView itemsView) => (handler.PlatformView as IMauiRecyclerView)?.UpdateAdapter(); + + void UpdateHeaderFooter(bool isHeader) + { + var recyclerView = PlatformView as IMauiRecyclerView; + var adapter = (recyclerView as RecyclerView)?.GetAdapter(); + + if (recyclerView is null || adapter is null) + { + return; + } + + bool hasHeaderOrFooter = isHeader + ? (VirtualView.Header ?? VirtualView.HeaderTemplate) != null + : (VirtualView.Footer ?? VirtualView.FooterTemplate) != null; + + bool exists = isHeader + ? DoesHeaderExist(adapter) + : DoesFooterExist(adapter); + + if (hasHeaderOrFooter && exists && IsDynamicChange()) + { + recyclerView.UpdateAdapter(); + } + else if (hasHeaderOrFooter != exists) + { + recyclerView.UpdateAdapter(); + } + } + + bool DoesHeaderExist(RecyclerView.Adapter adapter) + { + if (adapter.ItemCount <= 0) + { + return false; + } + + try + { + return adapter.GetItemViewType(0) == ItemViewType.Header; + } + catch + { + return false; + } + } + + bool DoesFooterExist(RecyclerView.Adapter adapter) + { + var footerPosition = adapter.ItemCount - 1; + if (footerPosition < 0) + { + return false; + } + + try + { + return adapter.GetItemViewType(footerPosition) == ItemViewType.Footer; + } + catch + { + return false; + } + } + + bool IsDynamicChange() + { + return (PlatformView as RecyclerView)?.IsLaidOut == true; + } } } diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue28509.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue28509.cs index 5c7ff7d28f55..5c388da1c58f 100644 --- a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue28509.cs +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue28509.cs @@ -1,5 +1,3 @@ -#if TEST_FAILS_ON_ANDROID -// https://github.com/dotnet/maui/issues/28676 using NUnit.Framework; using UITest.Appium; using UITest.Core; @@ -54,5 +52,4 @@ public void UpdateHeaderFooterDynamically() App.Click("ToggleFooterButton"); App.WaitForElement("Footer Changed"); } -} -#endif \ No newline at end of file +} \ No newline at end of file