我的列表视图的数据模板中有互联网图像,如下所示。这是一个简单的 mvvm 绑定,我根本不使用任何代码。在列表视图上快速滚动时,它会被冻结。看起来是由多次下载引起的。也许死锁(?我正在使用 ffimageload,但我尝试使用 XF 图像,使用它也出现问题。
我在 ffimageload 的文档中看到,它提到了 scrollstatechange 事件,但我在 xamarin 表单列表视图中找不到它。似乎建议的解决方案是本机安卓级别。当然,在XF中不使用它是有道理的,因为它是特定于Android的。问题是 如果这是解决方案,我该如何利用此事件?如果没有,此问题还有其他解决方案吗?
我在 UWP 中测试过,投掷不会导致任何性能或冻结。
<DataTemplate>
<Grid ColumnSpacing="0" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="2*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<ffimageloading:CachedImage RetryCount="1" TransparencyEnabled = "false" CacheDuration = "120"
LoadingPlaceholder="loading.png" FadeAnimationEnabled="True" CacheType="Disk"
InputTransparent="True" ErrorPlaceholder="thumb.png"
Source="{Binding Images, Converter={StaticResource thumbnailConvertor}}"
Aspect="AspectFit" Grid.Row="0" Grid.Column="0" />
<StackLayout Orientation="Vertical" Grid.Row="0" Grid.Column="1" >
<Label Text="{Binding name}" FontSize="20" FontAttributes="Bold"
</StackLayout>
</Grid>
</DataTemplate>
Xamarin Android 中的 ScrollStateChanged 事件
_
myListView.ScrollStateChanged += (object sender, ScrollStateChangedEventArgs scrollArgs) => {
switch (scrollArgs.ScrollState)
{
case ScrollState.Fling:
ImageService.Instance.SetPauseWork(true); // all image loading requests will be silently canceled
break;
case ScrollState.Idle:
ImageService.Instance.SetPauseWork(false); // loading requests are allowed again
// Here you should have your custom method that forces redrawing visible list items
_myListView.ForcePdfThumbnailsRedraw();
break;
}
};
编辑:Xamarin使用2.3.5 Pre6形成
我尝试使用最新的预发布版本,因为 xamarin 声称使用快速渲染器进行了改进,但似乎情况变得更糟。 列表视图在列表出现时即使没有滚动也会立即冻结。
我知道这是一个老问题,但也许这可以帮助某人。我无法对ScrollStateChange实现发表评论,但这里有一个基于您提供的标记的建议。
FFImageLoading 的文档建议避免绑定 CachedImage 视图的 Source 属性,因为它非常慢。改为在 OnBindingContextChanged 事件处理程序中设置图像源可以大大提高性能。
在具有大量元素的列表视图中使用,并且启用了ListViewCachingStrategy.RecycleElement(默认(