Xamarin CollectionView медленная прокрутка - PullRequest
1 голос
/ 30 мая 2020

У меня есть представление коллекции, которое показывает сообщения чата, оно имеет 10 возможных шаблонов данных. Каждый шаблон данных содержит гибкий макет (потому что мне нужно выровнять его по горизонтали слева или справа, как пузыри чата), а внутри этих гибких макетов у нас есть единственная сетка, которая может отображать изображение, метку, карту или медиаплеер. Он загружается очень быстро, но очень медленно при прокрутке. Я попытался снять flexlayout, но сетка не подчиняется LayoutOptions End / Start, которые мне нужны, затем я заменил FlexLayout на ContentView, который заполняет экран (по горизонтали), и я смог выровнять его дочерние элементы по горизонтали. Я не заметил улучшения производительности с этим изменением, возможно, даже стало хуже. Также я прочитал и внес изменения в соответствии с предложениями из Оптимизация производительности приложения , но, похоже, этого недостаточно.

Ниже у меня есть тег коллекции и пример одного шаблона данных, остальные очень похожи , почти нет разницы. Я сомневаюсь, как можно улучшить этот сценарий?

CollectionView

<CollectionView x:Name="ChatCollectionView" SelectionMode="None" HorizontalScrollBarVisibility="Never" VerticalScrollBarVisibility="Always" ItemsUpdatingScrollMode="KeepLastItemInView" ItemTemplate="{StaticResource MsgTemplateSelector}" Margin="5,0,5,0" />

Один из шаблонов данных

<DataTemplate x:Key="DefaultMsg">
    <FlexLayout Direction="Row" MinimumWidthRequest="50" JustifyContent="{Binding MsgAlign}">
            <Grid Padding="0" Margin="0,10,0,0">
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition Height="20"></RowDefinition>
                </Grid.RowDefinitions>

                <BoxView Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="2" CornerRadius="5" BackgroundColor="{Binding MsgBg}" />
                <Label Grid.Row="0" Grid.Column="0" Text="{Binding msg}" TextColor="Black" />

                <Grid Grid.Row="1" Grid.Column="0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="20" />
                    </Grid.ColumnDefinitions>

                    <Label Grid.Column="0" Grid.Row="0" TextColor="DarkGray" FontSize="12">
                        <Label.FormattedText>
                            <FormattedString>
                                <Span Text="&#xf017; ">
                                    <Span.FontFamily>
                                        <OnPlatform x:TypeArguments="x:String" Android="Font-Awesome-Free-Solid.otf#FontAwesome5Free-Solid" iOS="FontAwesome5Free-Solid" />
                                    </Span.FontFamily>
                                </Span>
                                <Span Text="{Binding date}" />
                                <Span Text=" at " />
                                <Span Text="{Binding hour}" />
                            </FormattedString>
                        </Label.FormattedText>
                    </Label>

                    <ActivityIndicator Grid.Column="1" Grid.Row="0" Color="#ff9000" HeightRequest="15" WidthRequest="15" IsRunning="{Binding sending}" IsVisible="{Binding sending}" HorizontalOptions="End" />
                    <Label Grid.Column="1" Grid.Row="0" Text="{Binding icon}" IsVisible="{Binding sent}" TextColor="{Binding IconColor}" FontSize="15" HorizontalOptions="End">
                        <Label.FontFamily>
                            <OnPlatform x:TypeArguments="x:String" Android="Font-Awesome-Free-Solid.otf#FontAwesome5Free-Solid" iOS="FontAwesome5Free-Solid" />
                        </Label.FontFamily>
                    </Label>
                </Grid>
            </Grid>
    </FlexLayout>
</DataTemplate>

Ответы [ 2 ]

0 голосов
/ 17 июля 2020

Я бы рекомендовал использовать Скомпилированные привязки . Эти 2 веб-сайта прекрасно объясняют, что такое Compiled Binding и как его использовать.

0 голосов
/ 26 июня 2020

В моем случае проблема была в пролете, я снял и поставил нормальную метку. Мой свиток снова стал плавным.

...