diff --git a/src/Controls/src/Core/Handlers/Items/Android/Adapters/SelectableItemsViewAdapter.cs b/src/Controls/src/Core/Handlers/Items/Android/Adapters/SelectableItemsViewAdapter.cs index e01307722606..1841d2d82900 100644 --- a/src/Controls/src/Core/Handlers/Items/Android/Adapters/SelectableItemsViewAdapter.cs +++ b/src/Controls/src/Core/Handlers/Items/Android/Adapters/SelectableItemsViewAdapter.cs @@ -123,7 +123,10 @@ bool PositionIsSelected(int position) void SelectableClicked(object sender, int adapterPosition) { - UpdateMauiSelection(adapterPosition); + if (adapterPosition >= 0 && adapterPosition < ItemsSource?.Count) + { + UpdateMauiSelection(adapterPosition); + } } void UpdateMauiSelection(int adapterPosition) diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue22674.xaml b/src/Controls/tests/TestCases.HostApp/Issues/Issue22674.xaml new file mode 100644 index 000000000000..943db1148138 --- /dev/null +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue22674.xaml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue22674.xaml.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue22674.xaml.cs new file mode 100644 index 000000000000..57fb42110218 --- /dev/null +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue22674.xaml.cs @@ -0,0 +1,28 @@ +using System.Collections.ObjectModel; +using Microsoft.Maui.Controls; +using Microsoft.Maui.Controls.Xaml; + +namespace Maui.Controls.Sample.Issues +{ + [XamlCompilation(XamlCompilationOptions.Compile)] + [Issue(IssueTracker.Github, 22674, "Crash when quickly clicking to delete item", PlatformAffected.iOS)] + public partial class Issue22674 : ContentPage + { + public Issue22674() + { + InitializeComponent(); + + BindingContext = this; + } + + public ObservableCollection ItemList { get; } = ["A", "B", "C", "D", "E", "F", "G", "H", "I",]; + + void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (sender is CollectionView view && view.SelectedItem is string item) + { + ItemList.Remove(item); + } + } + } +} \ No newline at end of file diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue22674.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue22674.cs new file mode 100644 index 000000000000..9dfc7eefee8b --- /dev/null +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue22674.cs @@ -0,0 +1,28 @@ +#if ANDROID +using NUnit.Framework; +using UITest.Appium; +using UITest.Core; + +namespace Microsoft.Maui.TestCases.Tests.Issues; + +public class Issue22674 : _IssuesUITest +{ + public Issue22674(TestDevice device) : base(device) { } + + public override string Issue => "Crash when quickly clicking to delete item"; + + [Test] + [Category(UITestCategories.CollectionView)] + public void RemoveItemWhenSelectionChanged() + { + App.WaitForElement("TestCollectionView"); + + for (int i = 0; i < 5; i++) + { + App.TapCoordinates(24, 24); + } + + // Without crashes, the test has passed. + } +} +#endif