Xamarin Forms Android Заполнения не отображаются в CollectionView - PullRequest
4 голосов
/ 06 апреля 2020

Мы наблюдаем странную проблему с нашим CollectionView в формах Xamarin, которую мы не можем объяснить. Сначала мы создали динамическое представление c с ListView, но некоторые или наши ячейки представления динамически меняют высоту, что не очень хорошо поддерживается ListView. Поэтому мы переключились на CollectionView, который должен поддерживать эту нативность. При просмотре списка у нас не было проблем с заполнением; но больше случайных сбоев из-за повторного использования памяти.

Мы используем представление Collection с селектором шаблонов для динамической загрузки различных шаблонов данных для создания LIST. Эти шаблоны данных могут различаться по высоте и функциям.

В настоящее время мы наблюдаем, что отступы не применяются к android или не корректны, или это похоже на некоторые проблемы с масштабированием, потому что это также выглядит как контент за границами. Это происходит только в этом collectionView на всех других представлениях, отступы правильны как для Android, так и iOS. Это происходит со всеми шаблонами данных, а не только с этим разделом.

Ниже представлены два снимка экрана: один iOS и один Android. Это показывает результат CollectionView с двумя элементами одного типа под друг другом.

Первый iOS, который имеет правильный вывод:

paddings showing on iOS

Второй Android; что кажется странным:

Paddings not showing on 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();
            }
        }
    }
}
...