Assert.IsNull(carouselView.ItemTemplate);
Assert.IsNotNull(carouselView.ItemsLayout);
Assert.IsTrue(carouselView.Position == 0);
- Assert.IsTrue(carouselView.ItemSizingStrategy == ItemSizingStrategy.None);
}
[Test]
SnapPointsType = SnapPointsType.MandatorySingle,
SnapPointsAlignment = SnapPointsAlignment.Center
};
- ItemSizingStrategy = ItemSizingStrategy.None;
}
[EditorBrowsable(EditorBrowsableState.Never)]
public enum ItemSizingStrategy
{
MeasureAllItems,
- MeasureFirstItem,
- None
+ MeasureFirstItem
}
}
\ No newline at end of file
set => SetValue(InternalItemsLayoutProperty, value);
}
- public static readonly BindableProperty ItemSizingStrategyProperty =
- BindableProperty.Create(nameof(ItemSizingStrategy), typeof(ItemSizingStrategy), typeof(ItemsView));
-
- public ItemSizingStrategy ItemSizingStrategy
- {
- get => (ItemSizingStrategy)GetValue(ItemSizingStrategyProperty);
- set => SetValue(ItemSizingStrategyProperty, value);
- }
-
public static readonly BindableProperty ItemTemplateProperty =
BindableProperty.Create(nameof(ItemTemplate), typeof(DataTemplate), typeof(ItemsView));
get => InternalItemsLayout;
set => InternalItemsLayout = value;
}
+
+ public static readonly BindableProperty ItemSizingStrategyProperty =
+ BindableProperty.Create(nameof(ItemSizingStrategy), typeof(ItemSizingStrategy), typeof(ItemsView));
+
+ public ItemSizingStrategy ItemSizingStrategy
+ {
+ get => (ItemSizingStrategy)GetValue(ItemSizingStrategyProperty);
+ set => SetValue(ItemSizingStrategyProperty, value);
+ }
}
}
\ No newline at end of file
UpdateAdapter();
}
- void UpdateAdapter()
+ 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
internal TItemsViewSource ItemsSource;
bool _disposed;
- Size? _size;
-
bool _usingItemTemplate = false;
internal ItemsViewAdapter(TItemsView itemsView, Func<View, Context, ItemContentView> createItemContentView = null)
return ItemsSource.GetPosition(item);
}
- protected void BindTemplatedItemViewHolder(TemplatedItemViewHolder templatedItemViewHolder, object context)
+ protected virtual void BindTemplatedItemViewHolder(TemplatedItemViewHolder templatedItemViewHolder, object context)
{
- if (ItemsView.ItemSizingStrategy == ItemSizingStrategy.MeasureFirstItem)
- {
- templatedItemViewHolder.Bind(context, ItemsView, SetStaticSize, _size);
- }
- else
- {
- templatedItemViewHolder.Bind(context, ItemsView);
- }
+ templatedItemViewHolder.Bind(context, ItemsView);
}
void UpdateItemsSource()
ItemsSource = CreateItemsSource();
}
- void SetStaticSize(Size size)
- {
- _size = size;
- }
-
void UpdateUsingItemTemplate()
{
_usingItemTemplate = ItemsView.ItemTemplate != null;
{
UpdateEmptyView();
}
- else if (changedProperty.Is(Xamarin.Forms.ItemsView.ItemSizingStrategyProperty))
- {
- UpdateAdapter();
- }
else if (changedProperty.Is(Xamarin.Forms.ItemsView.HorizontalScrollBarVisibilityProperty))
{
UpdateHorizontalScrollBarVisibility();
return (TAdapter)new ItemsViewAdapter<TItemsView, TItemsViewSource>(ItemsView);
}
- void UpdateAdapter()
+ protected virtual void UpdateAdapter()
{
var oldItemViewAdapter = ItemsViewAdapter;
where TItemsView : StructuredItemsView
where TItemsViewSource : IItemsViewSource
{
+ Size? _size;
+
internal StructuredItemsViewAdapter(TItemsView itemsView,
Func<View, Context, ItemContentView> createItemContentView = null) : base(itemsView, createItemContentView)
{
base.OnBindViewHolder(holder, position);
}
+ protected override void BindTemplatedItemViewHolder(TemplatedItemViewHolder templatedItemViewHolder, object context)
+ {
+ if (ItemsView.ItemSizingStrategy == ItemSizingStrategy.MeasureFirstItem)
+ {
+ templatedItemViewHolder.Bind(context, ItemsView, SetStaticSize, _size);
+ }
+ else
+ {
+ base.BindTemplatedItemViewHolder(templatedItemViewHolder, context);
+ }
+ }
+
void UpdateHasHeader()
{
ItemsSource.HasHeader = ItemsView.Header != null;
// No template, Footer is not a Forms View, so just display Footer.ToString
return SimpleViewHolder.FromText(content?.ToString(), context, fill: false);
}
+
+ void SetStaticSize(Size size)
+ {
+ _size = size;
+ }
}
}
\ No newline at end of file
{
UpdateLayoutManager();
}
+ else if (changedProperty.Is(StructuredItemsView.ItemSizingStrategyProperty))
+ {
+ UpdateAdapter();
+ }
}
protected override TAdapter CreateAdapter()
RegisterPropertyHandler(ItemsView.ItemsSourceProperty, UpdateItemsSource);
RegisterPropertyHandler(ItemsView.ItemTemplateProperty, UpdateAdaptor);
RegisterPropertyHandler(StructuredItemsView.ItemsLayoutProperty, UpdateItemsLayout);
- RegisterPropertyHandler(ItemsView.ItemSizingStrategyProperty, UpdateSizingStrategy);
+ RegisterPropertyHandler(StructuredItemsView.ItemSizingStrategyProperty, UpdateSizingStrategy);
RegisterPropertyHandler(SelectableItemsView.SelectedItemProperty, UpdateSelectedItem);
RegisterPropertyHandler(SelectableItemsView.SelectionModeProperty, UpdateSelectionMode);
}
readonly CarouselView _carouselView;
readonly ItemsLayout _itemsLayout;
- public CarouselViewLayout(ItemsLayout itemsLayout, ItemSizingStrategy itemSizingStrategy, CarouselView carouselView) : base(itemsLayout, itemSizingStrategy)
+ public CarouselViewLayout(ItemsLayout itemsLayout, CarouselView carouselView) : base(itemsLayout)
{
_carouselView = carouselView;
_itemsLayout = itemsLayout;
public override void ConstrainTo(CGSize size)
{
//TODO: Should we scale the items
- var aspectRatio = size.Width / size.Height;
var numberOfVisibleItems = _carouselView.NumberOfSideItems * 2 + 1;
var width = (size.Width - _carouselView.PeekAreaInsets.Left - _carouselView.PeekAreaInsets.Right) / numberOfVisibleItems;
var height = (size.Height - _carouselView.PeekAreaInsets.Top - _carouselView.PeekAreaInsets.Bottom) / numberOfVisibleItems;
protected override ItemsViewLayout SelectLayout()
{
- return new CarouselViewLayout(CarouselView.ItemsLayout, CarouselView.ItemSizingStrategy, CarouselView);
+ return new CarouselViewLayout(CarouselView.ItemsLayout, CarouselView);
}
protected override void SetUpNewElement(CarouselView newElement)
public ItemsUpdatingScrollMode ItemsUpdatingScrollMode { get; set; }
- protected ItemsViewLayout(ItemsLayout itemsLayout, ItemSizingStrategy itemSizingStrategy)
+ public nfloat ConstrainedDimension { get; set; }
+
+ public Func<UICollectionViewCell> GetPrototype { get; set; }
+
+ internal ItemSizingStrategy ItemSizingStrategy { get; private set; }
+
+ protected ItemsViewLayout(ItemsLayout itemsLayout, ItemSizingStrategy itemSizingStrategy = ItemSizingStrategy.MeasureFirstItem)
{
ItemSizingStrategy = itemSizingStrategy;
}
}
- public nfloat ConstrainedDimension { get; set; }
-
- public Func<UICollectionViewCell> GetPrototype { get; set; }
-
- internal ItemSizingStrategy ItemSizingStrategy { get; private set; }
-
public abstract void ConstrainTo(CGSize size);
public virtual UIEdgeInsets GetInsetForSection(UICollectionView collectionView, UICollectionViewLayout layout,
protected TItemsView ItemsView => Element;
-
-
public override UIViewController ViewController => Controller;
protected TViewController Controller { get; private set; }
{
Controller.UpdateEmptyView();
}
- else if (changedProperty.Is(Xamarin.Forms.ItemsView.ItemSizingStrategyProperty))
- {
- UpdateItemSizingStrategy();
- }
else if (changedProperty.Is(Xamarin.Forms.ItemsView.HorizontalScrollBarVisibilityProperty))
{
UpdateHorizontalScrollBarVisibility();
{
UpdateLayout();
}
+ else if (changedProperty.Is(StructuredItemsView.ItemSizingStrategyProperty))
+ {
+ UpdateItemSizingStrategy();
+ }
}
protected override void SetUpNewElement(TItemsView newElement)