dotnet / dotnet/maui

Android - Carousel View - always get an error "Can't set CarouselView to position -1. ItemsSource has 10 items."

Open
#32,037 7 comments 0 reactions 0 assignees View on GitHub
area-controls-collectionview platform/android s/triaged s/verified t/bug
Dominant language
C#
Stars
23.3k
Forks
2k
Avg merge
1d 15h
Merged PRs (30d)
290

Description

### Description

I'm using the native CarouselView, and I keep getting this error when debugging.

_Can't set CarouselView to position -1. ItemsSource has 10 items._

I use service to catch unhandled exceptions and what it saved

Image

### Steps to Reproduce

1. Create default ContenView.xaml
`












`

and cs file
`
public partial class MyCarousel : ContentView
{
private bool _isAdjustingPosition;

public MyCarousel()
{
InitializeComponent();
}

public static readonly BindableProperty ItemsSourceProperty =
BindableProperty.Create(
nameof(ItemsSource),
typeof(IEnumerable),
typeof(MyCarousel),
propertyChanged: OnItemsSourceChanged);

public IEnumerable ItemsSource
{
get => (IEnumerable)GetValue(ItemsSourceProperty);
set => SetValue(ItemsSourceProperty, value);
}

private static void OnItemsSourceChanged(BindableObject bindable, object oldValue, object newValue)
{
if (bindable is not MyCarousel carousel)
return;

if (newValue is IEnumerable items && items.Any())
{
carousel.Carousel.ItemsSource = items;
carousel.Carousel.IsVisible = true;
carousel.Indicators.IsVisible = true;

carousel.Dispatcher.Dispatch(() =>
{
carousel.TrySetInitialPosition();
});
}
else
{
carousel.Carousel.ItemsSource = null;
carousel.Carousel.IsVisible = false;
carousel.Indicators.IsVisible = false;
}
}

private void TrySetInitialPosition()
{
try
{
if (Carousel.ItemsSource is IEnumerable src && src.Any())
{
if (Carousel.Position < 0)
Carousel.Position = 0;
}
}
catch
{
// Ignore
}
}

private void Carousel_PositionChanged(object? sender, PositionChangedEventArgs e)
{
if (_isAdjustingPosition)
return;

if (Carousel.Position < 0)
{
_isAdjustingPosition = true;
Dispatcher.Dispatch(() =>
{
SafeSetPosition(0);
_isAdjustingPosition = false;
});
}
}

private void SafeSetPosition(int position)
{
try
{
if (Carousel.ItemsSource is IEnumerable src && src.Any())
{
Carousel.Position = Math.Max(0, Math.Min(position, src.Count() - 1));
}
}
catch
{
// Ignore
}
}`

### Link to public reproduction project repository

_No response_

### Version with bug

9.0.100 SR10

### Is this a regression from previous behavior?

Not sure, did not test other versions

### Last version that worked well

_No response_

### Affected platforms

Android

### Affected platform versions

Android 13

### Did you find any workaround?

No

### Relevant log output

```
System.IndexOutOfRangeException: Can't set CarouselView to position -1. ItemsSource has 10 items.
at void MauiCarouselRecyclerView.Microsoft.Maui.Controls.Handlers.Items.IMauiCarouselRecyclerView.UpdateFromPosition()() in MauiCarouselRecyclerView.cs:line 535
at void CarouselViewHandler.MapPosition(CarouselViewHandler handler, CarouselView carouselView)() in CarouselViewHandler.Android.cs:line 48
at void PropertyMapper.Add(string key, Action action)+(IElementHandler h, IElement v) => { }() in PropertyMapper.cs:line 244
at bool PropertyMapper.TryUpdatePropertyCore(string key, IElementHandler viewHandler, IElement virtualView)() in PropertyMapper.cs:line 64
at void PropertyMapper.UpdateProperty(IElementHandler viewHandler, IElement virtualView, string property)() in PropertyMapper.cs:line 115
at void ElementHandler.UpdateValue(string property)() in ElementHandler.cs:line 106
at void Element.UpdateHandlerValue(string property, bool valueChanged)() in Element.cs:line 693
at void VisualElement.UpdateHandlerValue(string property, bool valueChanged)() in VisualElement.cs:line 2018
at void Element.OnBindablePropertySet(BindableProperty property, object original, object value, bool changed, bool willFirePropertyChanged)() in Element.cs:line 651
at void BindableObject.SetValueActual(BindableProperty property, BindablePropertyContext context, object value, bool currentlyApplying, SetValueFlags attributes, SetterSpecificity specificity, bool silent)() in BindableObject.cs:line 663
at void BindableObject.SetValueCore(BindableProperty property, object value, SetValueFlags attributes, SetValuePrivateFlags privateAttributes, SetterSpecificity specificity)() in BindableObject.cs:line 591
at void BindableObject.SetValue(BindableProperty property, object value)() in BindableObject.cs:line 496
at void CarouselView.set_Position(int value)() in CarouselView.cs:line 170
at void MauiCarouselRecyclerView.UpdateInitialPosition()() in MauiCarouselRecyclerView.cs:line 343
at void MauiCarouselRecyclerView.UpdateAdapter()() in MauiCarouselRecyclerView.cs:line 144
at void MauiRecyclerView, IItemsViewSource>.UpdateItemTemplate()() in MauiRecyclerView.cs:line 140
at void ItemsViewHandler.MapItemTemplate(ItemsViewHandler handler, ItemsView itemsView)() in ItemsViewHandler.Android.cs:line 79
at void PropertyMapper.Add(string key, Action action)+(IElementHandler h, IElement v) => { }() in PropertyMapper.cs:line 244
at void PropertyMapper.UpdateProperties(IElementHandler viewHandler, IElement virtualView)() in PropertyMapper.cs:line 127
at void ElementHandler.SetVirtualView(IElement view)() in ElementHandler.cs:line 96
at void ViewHandler.SetVirtualView(IView view)() in ViewHandlerOfT.cs:line 53
at void ViewHandler.SetVirtualView(IElement view)() in ViewHandlerOfT.cs:line 56
at void Element.SetHandler(IElementHandler newHandler)() in Element.cs:line 1034
at void Element.set_Handler(IElementHandler value)() in Element.cs:line 976
at void VisualElement.Microsoft.Maui.IElement.set_Handler(IElementHandler value)() in VisualElement.cs:line 2137
at IElementHandler ElementExtensions.ToHandler(IElement view, IMauiContext context)() in ElementExtensions.cs:line 96
at View ElementExtensions.ToPlatform(IElement view, IMauiContext context)() in ElementExtensions.cs:line 127
at void LayoutHandler.SetVirtualView(IView view)() in LayoutHandler.Android.cs:line 41
at void ViewHandler.SetVirtualView(IElement view)() in ViewHandlerOfT.cs:line 56
at void Element.SetHandler(IElementHandler newHandler)() in Element.cs:line 1034
at void Element.set_Handler(IElementHandler value)() in Element.cs:line 976
at void VisualElement.Microsoft.Maui.IElement.set_Handler(IElementHandler value)() in VisualElement.cs:line 2137
at IElementHandler ElementExtensions.ToHandler(IElement view, IMauiContext context)() in ElementExtensions.cs:line 96
at View ElementExtensions.ToPlatform(IElement view, IMauiContext context)() in ElementExtensions.cs:line 127
at void ContentViewHandler.UpdateContent(IContentViewHandler handler)() in ContentViewHandler.Android.cs:line 42
at void ContentViewHandler.MapContent(IContentViewHandler handler, IContentView page)() in ContentViewHandler.Android.cs:line 47
at void PropertyMapper.Add(string key, Action action)+(IElementHandler h, IElement v) => { }() in PropertyMapper.cs:line 244
at void PropertyMapper.UpdateProperties(IElementHandler viewHandler, IElement virtualView)() in PropertyMapper.cs:line 127
at void ElementHandler.SetVirtualView(IElement view)() in ElementHandler.cs:line 96
at void ViewHandler.SetVirtualView(IView view)() in ViewHandlerOfT.cs:line 53
at void ContentViewHandler.SetVirtualView(IView view)() in ContentViewHandler.Android.cs:line 26
at void ViewHandler.SetVirtualView(IElement view)() in ViewHandlerOfT.cs:line 56
at void Element.SetHandler(IElementHandler newHandler)() in Element.cs:line 1034
at void Element.set_Handler(IElementHandler value)() in Element.cs:line 976
at void VisualElement.Microsoft.Maui.IElement.set_Handler(IElementHandler value)() in VisualElement.cs:line 2137
at IElementHandler ElementExtensions.ToHandler(IElement view, IMauiContext context)() in ElementExtensions.cs:line 96
at View ElementExtensions.ToPlatform(IElement view, IMauiContext context)() in ElementExtensions.cs:line 127
at void LayoutHandler.SetVirtualView(IView view)() in LayoutHandler.Android.cs:line 41
at void ViewHandler.SetVirtualView(IElement view)() in ViewHandlerOfT.cs:line 56
at void Element.SetHandler(IElementHandler newHandler)() in Element.cs:line 1034
at void Element.set_Handler(IElementHandler value)() in Element.cs:line 976
at void VisualElement.Microsoft.Maui.IElement.set_Handler(IElementHandler value)() in VisualElement.cs:line 2137
at IElementHandler ElementExtensions.ToHandler(IElement view, IMauiContext context)() in ElementExtensions.cs:line 96
at View ElementExtensions.ToPlatform(IElement view, IMauiContext context)() in ElementExtensions.cs:line 127
at void ScrollViewHandler.UpdateInsetView(IScrollView scrollView, IScrollViewHandler handler, ICrossPlatformLayout crossPlatformLayout)() in ScrollViewHandler.Android.cs:line 205
at void ScrollViewHandler.MapContent(IScrollViewHandler handler, IScrollView scrollView)() in ScrollViewHandler.Android.cs:line 133
at void PropertyMapper.Add(string key, Action action)+(IElementHandler h, IElement v) => { }() in PropertyMapper.cs:line 244
at void PropertyMapper.UpdateProperties(IElementHandler viewHandler, IElement virtualView)() in PropertyMapper.cs:line 127
at void ElementHandler.SetVirtualView(IElement view)() in ElementHandler.cs:line 96
at void ViewHandler.SetVirtualView(IView view)() in ViewHandlerOfT.cs:line 53
at void ViewHandler.SetVirtualView(IElement view)() in ViewHandlerOfT.cs:line 56
at void Element.SetHandler(IElementHandler newHandler)() in Element.cs:line 1034
at void Element.set_Handler(IElementHandler value)() in Element.cs:line 976
at void VisualElement.Microsoft.Maui.IElement.set_Handler(IElementHandler value)() in VisualElement.cs:line 2137
at IElementHandler ElementExtensions.ToHandler(IElement view, IMauiContext context)() in ElementExtensions.cs:line 96
at View ElementExtensions.ToPlatform(IElement view, IMauiContext context)() in ElementExtensions.cs:line 127
at void LayoutHandler.SetVirtualView(IView view)() in LayoutHandler.Android.cs:line 41
at void ViewHandler.SetVirtualView(IElement view)() in ViewHandlerOfT.cs:line 56
at void Element.SetHandler(IElementHandler newHandler)() in Element.cs:line 1034
at void Element.set_Handler(IElementHandler value)() in Element.cs:line 976
at void VisualElement.Microsoft.Maui.IElement.set_Handler(IElementHandler value)() in VisualElement.cs:line 2137
at IElementHandler ElementExtensions.ToHandler(IElement view, IMauiContext context)() in ElementExtensions.cs:line 96
at View ElementExtensions.ToPlatform(IElement view, IMauiContext context)() in ElementExtensions.cs:line 127
at void ContentViewHandler.UpdateContent(IContentViewHandler handler)() in ContentViewHandler.Android.cs:line 42
at void ContentViewHandler.MapContent(IContentViewHandler handler, IContentView page)() in ContentViewHandler.Android.cs:line 47
at void PropertyMapper.Add(string key, Action action)+(IElementHandler h, IElement v) => { }() in PropertyMapper.cs:line 244
at void PropertyMapper.UpdateProperties(IElementHandler viewHandler, IElement virtualView)() in PropertyMapper.cs:line 127
at void ElementHandler.SetVirtualView(IElement view)() in ElementHandler.cs:line 96
at void ViewHandler.SetVirtualView(IView view)() in ViewHandlerOfT.cs:line 53
at void ContentViewHandler.SetVirtualView(IView view)() in ContentViewHandler.Android.cs:line 26
at void ViewHandler.SetVirtualView(IElement view)() in ViewHandlerOfT.cs:line 56
at void Element.SetHandler(IElementHandler newHandler)() in Element.cs:line 1034
at void Element.set_Handler(IElementHandler value)() in Element.cs:line 976
at void VisualElement.Microsoft.Maui.IElement.set_Handler(IElementHandler value)() in VisualElement.cs:line 2137
at IElementHandler ElementExtensions.ToHandler(IElement view, IMauiContext context)() in ElementExtensions.cs:line 96
at View ElementExtensions.ToPlatform(IElement view, IMauiContext context)() in ElementExtensions.cs:line 127
at View MauiContextExtensions.ToPlatform(IView view, IMauiContext fragmentMauiContext, Context context, LayoutInflater layoutInflater, FragmentManager childFragmentManager)() in MauiContextExtensions.cs:line 96
at View NavigationViewFragment.OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)() in NavigationViewFragment.cs:line 56
at IntPtr Fragment.n_OnCreateView_Landroid_view_LayoutInflater_Landroid_view_ViewGroup_Landroid_os_Bundle_(IntPtr jnienv, IntPtr native__this, IntPtr native_inflater, IntPtr native_container, IntPtr native_savedInstanceState)() in C:\a\_work\1\s\generated\androidx.fragment.fragment\obj\Release\net8.0-android\generated\src\AndroidX.Fragment.App.Fragment.cs:line 2045
at IntPtr JNINativeWrapper.Wrap_JniMarshal_PPLLL_L(_JniMarshal_PPLLL_L callback, IntPtr jnienv, IntPtr klazz, IntPtr p0, IntPtr p1, IntPtr p2)() in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:line 363
```

Contributor guide

Open the contributing guide

Research direction

Start with MauiCarouselRecyclerView.cs at UpdateInitialPosition, UpdateAdapter, and UpdateFromPosition, then inspect CarouselViewHandler.Android.cs at MapPosition. Reproduce the ContentView example on Android 13 with ten items and trace when Position becomes -1; done means the CarouselView initializes without the IndexOutOfRangeException and retains a valid position.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, csharp
Domain
mobile
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.