protected override void UpdateAdapter() { // By default the CollectionViewAdapter creates the items at whatever size the template calls for // But for the Carousel, we want it to create the items to fit the width/height of the viewport // So we give it an alternate delegate for creating the views var oldItemViewAdapter = ItemsViewAdapter; UnsubscribeCollectionItemsSourceChanged(oldItemViewAdapter); ItemsViewAdapter = new ItemsViewAdapter <ItemsView, IItemsViewSource>(ItemsView, (view, context) => new SizedItemContentView(Context, GetItemWidth, GetItemHeight)); _gotoPosition = -1; SwapAdapter(ItemsViewAdapter, false); if (_oldPosition > 0) { UpdateInitialPosition(); } if (ItemsViewAdapter?.ItemsSource is ObservableItemsSource observableItemsSource) { observableItemsSource.CollectionItemsSourceChanged += CollectionItemsSourceChanged; } oldItemViewAdapter?.Dispose(); }
void UnsubscribeCollectionItemsSourceChanged(ItemsViewAdapter <ItemsView, IItemsViewSource> oldItemViewAdapter) { if (oldItemViewAdapter?.ItemsSource is ObservableItemsSource oldObservableItemsSource) { oldObservableItemsSource.CollectionItemsSourceChanged -= CollectionItemsSourceChanged; } }
void UpdateNativeSelection() { var mode = ItemsView.SelectionMode; ItemsViewAdapter.ClearNativeSelection(); switch (mode) { case SelectionMode.None: return; case SelectionMode.Single: var selectedItem = ItemsView.SelectedItem; ItemsViewAdapter.MarkNativeSelection(selectedItem); return; case SelectionMode.Multiple: var selectedItems = ItemsView.SelectedItems; foreach (var item in selectedItems) { ItemsViewAdapter.MarkNativeSelection(item); } return; } }
public CarouselViewOnScrollListener(ItemsView itemsView, ItemsViewAdapter <ItemsView, IItemsViewSource> itemsViewAdapter) : base(itemsView, itemsViewAdapter) { }