diff --git a/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewDelegator.cs b/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewDelegator.cs
index ee59bbeb8105..0c492a691d99 100644
--- a/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewDelegator.cs
+++ b/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewDelegator.cs
@@ -29,12 +29,9 @@ public override void Scrolled(UIScrollView scrollView)
{
var (visibleItems, firstVisibleItemIndex, centerItemIndex, lastVisibleItemIndex) = GetVisibleItemsIndex();
- if (!visibleItems)
- return;
-
var contentInset = scrollView.ContentInset;
- var contentOffsetX = scrollView.ContentOffset.X + contentInset.Left;
- var contentOffsetY = scrollView.ContentOffset.Y + contentInset.Top;
+ var contentOffsetX = !visibleItems ? 0 : scrollView.ContentOffset.X + contentInset.Left;
+ var contentOffsetY = !visibleItems ? 0 : scrollView.ContentOffset.Y + contentInset.Top;
var itemsViewScrolledEventArgs = new ItemsViewScrolledEventArgs
{
diff --git a/src/Controls/src/Core/Handlers/Items2/iOS/ItemsViewDelegator2.cs b/src/Controls/src/Core/Handlers/Items2/iOS/ItemsViewDelegator2.cs
index 06a31fb5ec1e..65316f388d7f 100644
--- a/src/Controls/src/Core/Handlers/Items2/iOS/ItemsViewDelegator2.cs
+++ b/src/Controls/src/Core/Handlers/Items2/iOS/ItemsViewDelegator2.cs
@@ -29,12 +29,9 @@ public override void Scrolled(UIScrollView scrollView)
{
var (visibleItems, firstVisibleItemIndex, centerItemIndex, lastVisibleItemIndex) = GetVisibleItemsIndex();
- if (!visibleItems)
- return;
-
var contentInset = scrollView.ContentInset;
- var contentOffsetX = scrollView.ContentOffset.X + contentInset.Left;
- var contentOffsetY = scrollView.ContentOffset.Y + contentInset.Top;
+ var contentOffsetX = !visibleItems ? 0 : scrollView.ContentOffset.X + contentInset.Left;
+ var contentOffsetY = !visibleItems ? 0 : scrollView.ContentOffset.Y + contentInset.Top;
var itemsViewScrolledEventArgs = new ItemsViewScrolledEventArgs
{
diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue21708.xaml b/src/Controls/tests/TestCases.HostApp/Issues/Issue21708.xaml
new file mode 100644
index 000000000000..aa8df9695582
--- /dev/null
+++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue21708.xaml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue21708.xaml.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue21708.xaml.cs
new file mode 100644
index 000000000000..1c45172efd44
--- /dev/null
+++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue21708.xaml.cs
@@ -0,0 +1,52 @@
+using System.Collections.ObjectModel;
+
+namespace Maui.Controls.Sample.Issues
+{
+ [XamlCompilation(XamlCompilationOptions.Compile)]
+ [Issue(IssueTracker.Github, 21708, "CollectionView.Scrolled event offset isn't correctly reset when items change on Android", PlatformAffected.All)]
+ public partial class Issue21708 : ContentPage
+ {
+ ObservableCollection _items;
+ double _verticalOffset;
+
+ public Issue21708()
+ {
+ InitializeComponent();
+ _items = new ObservableCollection();
+ AddItemsToCollectionView();
+ CollectionView.ItemsSource = _items;
+ BindingContext = this;
+ }
+
+ public double VerticalOffset
+ {
+ get => _verticalOffset;
+ set
+ {
+ _verticalOffset = value;
+ OnPropertyChanged(nameof(VerticalOffset));
+ }
+ }
+
+ void CollectionView_OnScrolled(object sender, ItemsViewScrolledEventArgs e)
+ {
+ VerticalOffset = e.VerticalOffset;
+ }
+
+ void EmptyButton_OnClicked(object sender, EventArgs e)
+ {
+ _items.Clear();
+ }
+
+ void FillButton_OnClicked(object sender, EventArgs e)
+ {
+ AddItemsToCollectionView();
+ }
+
+ void AddItemsToCollectionView()
+ {
+ foreach (var i in Enumerable.Range(0, 50))
+ _items.Add(i);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue21708.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue21708.cs
new file mode 100644
index 000000000000..4708ff0100d5
--- /dev/null
+++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue21708.cs
@@ -0,0 +1,25 @@
+using NUnit.Framework;
+using UITest.Appium;
+using UITest.Core;
+
+namespace Microsoft.Maui.TestCases.Tests.Issues;
+
+public class Issue21708 : _IssuesUITest
+{
+ public Issue21708(TestDevice device) : base(device) { }
+
+ public override string Issue => "CollectionView.Scrolled event offset isn't correctly reset when items change on Android";
+
+ [Test]
+ [Category(UITestCategories.CollectionView)]
+ public void VerifyCollectionViewVerticalOffset()
+ {
+ App.WaitForElement("Fill");
+ App.ScrollDown("CollectionView");
+ Assert.That(App.FindElement("Label").GetText(), Is.GreaterThan("0"));
+ App.Tap("Empty");
+ #if !ANDROID
+ Assert.That(App.FindElement("Label").GetText(), Is.EqualTo("0"));
+ #endif
+ }
+}
\ No newline at end of file