我在listview的datatemplate中有互联网图像,如下所示。这是一个简单的mvvm绑定,我根本不使用任何代码。在列表视图上快速滚动时,它会被冻结。看起来它是由多次下载引起的。也许死锁(?)我正在使用ffimageloading但我尝试使用XF图像,并且使用它也会出现问题。
我在ffimageloading的documentation中看到,提到了有关scrollstatechanged事件但我无法在xamarin表单列表视图中找到它。似乎建议的解决方案是原生的android级别。当然,不要在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声称使用快速渲染器进行了改进,但似乎事情变得更糟。当列表出现时,即使没有滚动,listview也会立即冻结。
答案 0 :(得分:0)
我知道这是一个古老的问题,但这也许可以帮助某个人。我无法评论ScrollStateChange的实现,但这是根据您提供的标记的建议。
FFImageLoading的文档建议避免绑定CachedImage视图的Source属性,因为它非常慢。相反,在OnBindingContextChanged事件处理程序中设置图像源可以大大提高性能。