[英]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
首先,将资源字典从模板内部移动到包含页面。
然后,就像其他人所说的那样:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.