在Xamarin Forms中,我有以下列表视图:
<ListView x:Name="StudentView" RowHeight="55" SeparatorVisibility="None" CachingStrategy="RecycleElement">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="55"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Image Source="{Binding Image}" Grid.Row="0" Grid.Column="0" Aspect="AspectFill"></Image>
<Image Source="{Binding Image}" Grid.Row="0" Grid.Column="1" Aspect="AspectFill"></Image>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
在后面的代码中,我声明了一个包含1000个项目的数组。
问题在于,如果我在列表视图中向上和向下滚动,每次我在xamarin配置文件中看到内存使用量增加并且似乎CachingStrategy =&#34; RecycleElement&#34;不能正常工作(在真正的Android设备上测试)。
滚动一段时间后,程序因内存不足而崩溃。
问题是什么?我该如何解决?
答案 0 :(得分:0)
不确定如何设置列表视图的ItemSource,或者它是什么。为此显示一些代码隐藏文件也很有用。
如果您的来源不可转化,那么如果盲目猜测回收可能会出现性能问题。 Xamarin的建议是使用IList作为itemsource,使用像IEnumerable这样的东西会导致大型数组的性能问题,因为它基本上必须循环遍历数据才能找到合适的项目进行显示。
答案 1 :(得分:0)
1000个图像项目很多!我打赌这是Android,我建议使用不同的解决方案,如:
1.- Pagging策略(Load 10,负载另外10等)。 2.-减小图像尺寸。 3.-使用可缓存的图像,如: https://github.com/luberda-molinet/FFImageLoading 4.-使用Recycler视图实现View自定义渲染器。
然后关于如何提高ListView性能的话题越来越大,这里有一些有用的链接:
- https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/performance/
- https://blog.xamarin.com/creating-highly-performant-smooth-scrolling-android-listviews/
- https://blog.xamarin.com/tips-for-creating-a-smooth-and-fluid-android-ui/
- http://kent-boogaart.com/blog/jason-smith's-xamarin-forms-performance-tips
答案 2 :(得分:0)