繁体   English   中英

Xamarin表单ListView性能

[英]Xamarin Forms ListView Performance

我的应用程序中有一个Xamarin.Forms ListView ,此ListView使用DataTemplateSelector选择的不同ItemTemplates。 使用某些模板,它可以很好地工作,但也有一些模板会产生性能问题。 这是一个错误的模板的代码:

<DataTemplate x:Key="Template1">
    <ViewCell>
        <Grid Padding="10,0,10,0">
            <Grid.Resources>
                <ResourceDictionary>
                    <Style TargetType="Label" BasedOn="{StaticResource LabelStyle}"/>
                    <Style TargetType="BoxView" BasedOn="{StaticResource InactiveStyle}"/>
                </ResourceDictionary>
            </Grid.Resources>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Image Grid.Column="0" Grid.RowSpan="3" Source="Icon.png" HeightRequest="30" WidthRequest="30" Margin="0,0,10,0" VerticalOptions="Center" HorizontalOptions="Center"/>

            <BoxView Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="2" IsVisible="{Binding Inactive}"/>
            <Label Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="2" x:Name="Label1" Text="{Binding Column1}" FontAttributes="Bold"/>

            <BoxView Grid.Column="1" Grid.Row="1" IsVisible="{Binding Inactive}"/>
            <Label Grid.Column="1" Grid.Row="1" Text="{Binding Column2}" HorizontalOptions="Start"/>

            <BoxView Grid.Column="2" Grid.Row="1" IsVisible="{Binding Inactive}"/>
            <Label Grid.Column="2" Grid.Row="1" Text="{Binding Column3}" HorizontalOptions="End"/>

            <BoxView Grid.Column="1" Grid.Row="2" IsVisible="{Binding Inactive}"/>
            <Label Grid.Column="1" Grid.Row="2" Text="{Binding Column4}" HorizontalOptions="Start" />

            <BoxView Grid.Column="2" Grid.Row="2" IsVisible="{Binding Inactive}"/>
            <Label Grid.Column="2" Grid.Row="2" Text="{Binding Column5}" HorizontalOptions="End"/>
        </Grid>
    </ViewCell>
</DataTemplate>

我也发现了这一点: Xamarin ListView性能,但是我无法使其滚动更快。 似乎无法足够快地创建单元格,因此列表滚动变得混乱(Android和iOS)。 我该怎么做才能更快地做到这一点?

编辑:我切换到CachingStrategy="RetailElement"并能够优化一些东西。 但是总是在调用OnSelectTemplate方法时滚动变慢。 即使此方法仅在第一行中返回模板。 所以对我来说,看起来模板需要很长时间才能构建。 但我不知道为什么:(

关于滚动,您需要激活适当的RecyclingMode:

<ListView CachingStrategy="RecycleElement">

如果您使用DataTemplate选择器,请使用:

 <ListView CachingStrategy="RecycleElementAndDataTemplate" />

您可能必须调整您的DataTemplate创建过程。 但是使用这种技术,仅在必要时才调用OnSelectTemplate。

此外,如果这还不够的话,您应该使用DataTemplateSelector逻辑根据非活动状态将dataTemplate分成2个,以避免可能昂贵的元素上的IsVisible Binding。

对于Xamarin.Form Listview性能的最佳选项,您可以使用自定义渲染器使用本机视图。

以下是“自定义渲染器示例”的链接。

https://github.com/xamarin/xamarin-forms-samples/tree/master/CustomRenderers/ListView

首先,将资源字典从模板内部移动到包含页面。

然后,就像其他人所说的那样:

  1. 使第一列固定宽度
  2. 用自己的实现删除线的自定义标签替换boxviews
  3. 使用缓存策略

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM