代码之家  ›  专栏  ›  技术社区  ›  Omar Himada

Xamarin图像有时不在ListView中下载

  •  0
  • Omar Himada  · 技术社区  · 5 年前

    我有一个包含两列的ListView,其中最左侧包含一个 <Image> 这样地:

    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <ViewCell.View>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="0.5*" />
                            <ColumnDefinition Width="0.5*" />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                        </Grid.RowDefinitions>
                        <AbsoluteLayout Grid.Column="0" Grid.Row="0">
                            <Image 
                                HeightRequest="130" 
                                Aspect="AspectFill" 
                                Source="{Binding DynamicOfferImage}" 
                                local:ImageBinding.URL="{Binding DynamicOfferURL}" 
                                AbsoluteLayout.LayoutBounds="1,1,1,1" 
                                AbsoluteLayout.LayoutFlags="All">
                                <Image.Aspect>
                                    <OnPlatform x:TypeArguments="Aspect">
                                        <On Platform="iOS">AspectFit</On>
                                        <On Platform="Android">AspectFit</On>
                                    </OnPlatform>
                                </Image.Aspect>
                                <Image.GestureRecognizers>
                                    <TapGestureRecognizer
                                        Tapped="OnImageTapGestureRecognized"
                                        NumberOfTapsRequired="1" />
                                </Image.GestureRecognizers>
                            </Image>
                            <StackLayout IsVisible="{Binding IsRedeemed}" Margin="20" AbsoluteLayout.LayoutBounds="1,1,1,1" AbsoluteLayout.LayoutFlags="All">
                                <ContentView Padding="3" BackgroundColor="#d9534f">
                                    <Label Text="{loc:_ S=LoginIsRedeemed}" FontSize="Medium" TextColor="#ffffff" HorizontalOptions="Center"></Label>
                                </ContentView>
                            </StackLayout>
                        </AbsoluteLayout>
    
                        <StackLayout Grid.Column="1" Grid.Row="0">
                            <!-- Text here, irrelevant to question -->
                        </StackLayout>
                    </Grid>
                </ViewCell.View>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
    

    这个 <图像> Source 属性绑定到托管在Amazon S3上的JPEG图像的URL。问题是 大多数时候 但是,这些图像下载得很好 有时

    这个问题不会消失,直到用户 重新安装 应用程序。即使重新启动应用程序也不算数,它必须是实际的重新安装。

    下面是一些场景中的模拟结果: enter image description here

    非常感谢任何帮助!

    笔记 :这不是的副本 Xamarin Forms ListView Images Sometimes Displays, Sometimes Doesn't (UWP)

    1 回复  |  直到 5 年前
        1
  •  1
  •   Omar Himada    4 年前

    我最终接受了G.hakim的建议,决定使用FFImageLoading(通过NuGet软件包)来加载图像。虽然我不得不为Xamarin.Android使用稍微旧一点的版本,但它非常简单。最新版本(2.4.4.859)出现一些奇怪的链接器错误,必须返回到2.4.1。无论哪种方式,它都非常有效,甚至为Xamarin.iOS上的图像添加了一点动画。

    <Image 
        HeightRequest="130" 
        Aspect="AspectFill" 
        Source="{Binding ImageURL}" 
        local:ImageBinding.URL="{Binding LinkURL}" 
        AbsoluteLayout.LayoutBounds="1,1,1,1" 
        AbsoluteLayout.LayoutFlags="All">
        <Image.Aspect>
            <OnPlatform x:TypeArguments="Aspect">
                <On Platform="iOS">AspectFit</On>
                <On Platform="Android">AspectFit</On>
            </OnPlatform>
        </Image.Aspect>
        <Image.GestureRecognizers>
            <TapGestureRecognizer
                Tapped="OnImageTapGestureRecognized"
                NumberOfTapsRequired="1" />
        </Image.GestureRecognizers>
    </Image>
    

    为了让FFImageLoading工作,您必须将其添加到根目录中 <ContentPage> 要素:

    xmlns:ffimageloading="clr-namespace:FFImageLoading.Forms;assembly=FFImageLoading.Forms"
    xmlns:fftransformations="clr-namespace:FFImageLoading.Transformations;assembly=FFImageLoading.Transformations"
    

    然后我就能做到这一点:

    <ffimageloading:CachedImage 
        AbsoluteLayout.LayoutBounds="1,1,1,1" 
        AbsoluteLayout.LayoutFlags="All"
        HeightRequest="130"
        DownsampleToViewSize="true" 
        Source="{Binding ImageURL}"
        local:ViewBinding.URL="{Binding LinkURL}">
        <ffimageloading:CachedImage.GestureRecognizers>
            <TapGestureRecognizer
                Tapped="OnViewTapGestureRecognized"
                NumberOfTapsRequired="1" />
        </ffimageloading:CachedImage.GestureRecognizers>
    </ffimageloading:CachedImage>
    

    为了让它与我的 TapGestureRecognizer ((Image)sender) 将该方法转换为 ((View)sender) CachedImage FFImageLoading中的类实际上不是从 Image ,它继承自 View . 如果你有手势,甚至是自定义绑定,一定要记住。

    除此之外,它非常即插即用,我对结果非常满意。