Мы наблюдаем странную проблему с нашим CollectionView в формах Xamarin, которую мы не можем объяснить. Сначала мы создали динамическое представление c с ListView, но некоторые или наши ячейки представления динамически меняют высоту, что не очень хорошо поддерживается ListView. Поэтому мы переключились на CollectionView, который должен поддерживать эту нативность. При просмотре списка у нас не было проблем с заполнением; но больше случайных сбоев из-за повторного использования памяти.
Мы используем представление Collection с селектором шаблонов для динамической загрузки различных шаблонов данных для создания LIST. Эти шаблоны данных могут различаться по высоте и функциям.
В настоящее время мы наблюдаем, что отступы не применяются к android или не корректны, или это похоже на некоторые проблемы с масштабированием, потому что это также выглядит как контент за границами. Это происходит только в этом collectionView на всех других представлениях, отступы правильны как для Android, так и iOS. Это происходит со всеми шаблонами данных, а не только с этим разделом.
Ниже представлены два снимка экрана: один iOS и один Android. Это показывает результат CollectionView с двумя элементами одного типа под друг другом.
Первый iOS, который имеет правильный вывод:
Второй Android; что кажется странным:
Код этого специфики DataTemplate:
<DataTemplate x:Key="SectionTemplate">
<ContentView Padding="0, 4, 0, 0" BackgroundColor="Red">
<Grid Padding="8, 0, 17, 0" BackgroundColor="White">
<Grid.HeightRequest>
<OnIdiom x:TypeArguments="x:Double" Phone="50" Tablet="54.5"/>
</Grid.HeightRequest>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="15"/>
</Grid.ColumnDefinitions>
<uikit:Label Grid.Column="0" StyleClass="SectionTitle" HorizontalTextAlignment="Start" Text="{Binding Name}" VerticalOptions="Center" VerticalTextAlignment="Center" />
<uikit:Label Grid.Column="1" StyleClass="FoldButton" Text="{Binding FoldText}" TextColor="{StaticResource LightGreyFont}" FontAttributes="Bold" HorizontalOptions="CenterAndExpand" VerticalOptions="Center"/>
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding FoldCommand}" />
</Grid.GestureRecognizers>
</Grid>
</ContentView>
</DataTemplate>
Код представления, в котором загружается CollectionView:
<?xml version="1.0" encoding="UTF-8" ?>
<view:ProductView
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:view="clr-namespace:Forms.Pages;assembly=Product.Forms"
xmlns:vm="clr-namespace:Forms.BLL.ViewModels.ItemDetail"
xmlns:datatemplates="clr-namespace:Forms.Resources.Templates"
xmlns:templateselectors="clr-namespace:Forms.Helpers.DataTemplates"
xmlns:converters="clr-namespace:Forms.Converters;assembly=Product.Forms"
x:Class="Forms.Pages.Detail.Item.ItemDetailView"
VerticalOptions="FillAndExpand"
HorizontalOptions="FillAndExpand">
<view:ProductView.BindingContext>
<vm:ItemDetailViewModel />
</view:ProductView.BindingContext>
<view:ProductView.Resources>
<ResourceDictionary>
<!-- All Template items -->
</ResourceDictionary>
</view:ProductView.Resources>
<view:ProductView.Content>
<AbsoluteLayout BackgroundColor="{ StaticResource LightGreyBackground }" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
<ActivityIndicator AbsoluteLayout.LayoutFlags="SizeProportional"
AbsoluteLayout.LayoutBounds="0,0,1,1"
Color="{StaticResource PendingBlue}"
VerticalOptions="Center"
IsVisible="{Binding IsLoading}"
IsRunning="{Binding IsLoading}" />
<CollectionView
ItemsSource="{Binding ElementRows}"
BackgroundColor="Transparent"
ItemTemplate="{StaticResource ItemDetailTemplate}"
SelectionMode="None"
VerticalOptions="FillAndExpand"
HorizontalOptions="FillAndExpand">
</CollectionView>
</AbsoluteLayout>
</view:ProductView.Content>
</view:ProductView>
Мы попытались установить для ItemSizingStrategy значение MeasureAllItems, для ItemsLayout иметь интервал 0, удалив AbsoluteLayout вокруг него. Настройка параметров Вертикальный и Горизонтальный в ContentView. Все это не помогло.
<CollectionView.ItemsLayout>
<LinearItemsLayout Orientation="Vertical"
ItemSpacing=“0” />
</CollectionView.ItemsLayout>
Код нашей перегрузки ContentView для включения некоторых дополнительных параметров загрузки:
Namespace Product.Forms.Pages
{
public class ProductView : ContentView
{
public ProductView()
{
AppCenterHelper.Instance.TrackEvent(TrackEventName.PAGE_OPENED, this.GetType().ToString().Split('.').LastOrDefault());
}
public async Task LoadData(Guid key)
{
if (BindingContext is ViewModelBase viewModel)
{
if (viewModel.Loaded == LoadStatus.RequiresLoad)
{
viewModel.Loaded = LoadStatus.Loading;
await viewModel.Load(key);
// await viewModel.Load(_id, LazyLoadingBatchSize);
viewModel.ApplyFilter(String.Empty);
viewModel.Loaded = LoadStatus.Succes;
// viewModel.LazyLoaded = LoadStatus.Succes
}
else
{
await viewModel.Reload();
}
if (!viewModel.HasSubscribedToMessageCenter)
{
SubscribeToMessagingCenter();
}
}
else
{
throw new NullReferenceException($"ViewModel of {this.GetType().ToString()} is not set as a ViewModelBase.");
}
}
public void SubscribeToMessagingCenter()
{
if (BindingContext is ViewModelBase vm)
{
vm.SubscribeToMessagingCenter();
vm.HasSubscribedToMessageCenter = true;
}
}
public void UnSubscribeFromMessagingCenter()
{
if (BindingContext is ViewModelBase vm)
{
vm.UnSubscribeFromMessagingCenter();
}
}
}
}