ListView Fast Scroll在DataTemplate

时间:2017-07-31 17:30:44

标签: listview xamarin.android xamarin.forms ffimageloading

我在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也会立即冻结。

1 个答案:

答案 0 :(得分:0)

我知道这是一个古老的问题,但这也许可以帮助某个人。我无法评论ScrollStateChange的实现,但这是根据您提供的标记的建议。

FFImageLoading的文档建议避免绑定CachedImage视图的Source属性,因为它非常慢。相反,在OnBindingContextChanged事件处理程序中设置图像源可以大大提高性能。

Usage in ListView with a lot of elements and ListViewCachingStrategy.RecycleElement enabled (default)